OOP でのすべての練習で、クラス定義の外で $this を使用したことはありません。
zendframework では、ビュー テンプレート ファイルで $this を使用しますが、明らかにクラス定義のスコープではありません。どのように実装されているのだろうか?私はたくさんグーグルで検索しましたが、運がありませんでした。
zendframework が $this を使用してビュー ファイルをレンダリングするメカニズムを知りたいです。
OOP でのすべての練習で、クラス定義の外で $this を使用したことはありません。
zendframework では、ビュー テンプレート ファイルで $this を使用しますが、明らかにクラス定義のスコープではありません。どのように実装されているのだろうか?私はたくさんグーグルで検索しましたが、運がありませんでした。
zendframework が $this を使用してビュー ファイルをレンダリングするメカニズムを知りたいです。
ビュー内のスクリプト ファイル ( .phtml
ones)$this
は、現在使用されているクラスのインスタンス (Zend_View
この特定のスクリプトをレンダリングするように命令されたもの) を参照します。ドキュメントの引用:
これは
[a view script]
他の PHP スクリプトと同様ですが、1 つの例外があります。それは、Zend_View インスタンスのスコープ内で実行されます。つまり、$this への参照は、Zend_View インスタンスのプロパティとメソッドを指します。(コントローラーによってインスタンスに割り当てられた変数は、Zend_View インスタンスのパブリック プロパティです)。
コントローラーが (明示的または暗黙的に)render
メソッド (Zend_View_Abstract
クラスで定義) を呼び出すと、次のメソッド (Zend_View
クラスで定義) が最後に実行されます。
/**
* Includes the view script in a scope with only public $this variables.
*
* @param string The view script to execute.
*/
protected function _run()
{
if ($this->_useViewStream && $this->useStreamWrapper()) {
include 'zend.view://' . func_get_arg(0);
} else {
include func_get_arg(0);
}
}
... ここでfunc_get_arg(0)
は、含まれるスクリプトの完全なファイル名 (パス + 名前) を参照します。
実際には、クラス定義のスコープ内にあります。簡単なテストケース:
<?php
// let's call this view.php
class View {
private $variable = 'value';
public function render( ) {
ob_start( );
include 'my-view.php';
$content = ob_get_clean( );
return $content;
}
}
$view = new View;
echo $view->render( );
次に、別のファイルを作成します。
<?php
// let's call this my-view.php.
<h1>Private variable: <?php echo $this->variable; ?></h1>
次に、view.phpにアクセスすると、my-view.phpがViewクラスのプライベート変数にアクセスできることがわかります。を使用するinclude
と、実際にPHPファイルを現在のスコープにロードします。