1

OOP でのすべての練習で、クラス定義の外で $this を使用したことはありません。

zendframework では、ビュー テンプレート ファイルで $this を使用しますが、明らかにクラス定義のスコープではありません。どのように実装されているのだろうか?私はたくさんグーグルで検索しましたが、運がありませんでした。

zendframework が $this を使用してビュー ファイルをレンダリングするメカニズムを知りたいです。

4

2 に答える 2

10

ビュー内のスクリプト ファイル ( .phtmlones)$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)は、含まれるスクリプトの完全なファイル名 (パス + 名前) を参照します。

于 2012-12-12T12:59:51.313 に答える
3

実際に、クラス定義のスコープ内にあります。簡単なテストケース:

<?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ファイルを現在のスコープにロードします。

于 2012-12-12T13:01:23.737 に答える