PHP:ローカル関数変数に__getのような方法を実装する方法

StackOverflow https://stackoverflow.com/questions/2669195

  •  28-09-2019
  •  | 
  •  

質問

私は__get()に見知らぬ人ではなく、過去に非常に便利なライブラリを作るためにそれを使用しました。しかし、私は新しい課題に直面しています(PHP 5.3、この質問のコードを省略し、簡略化しました):

<?php
namespace test;

class View {
    function __construct($filename, $varArray) {
        $this->filename = $filename;
        $this->varArray = $varArray;
    }

    function display() {
        include($this->filename);
    }

    function __get($varName) {
        if (isset($this->varArray[$varName]))
            return $this->varArray[$varName];
        return "?? $varname ??";
    }
}

?>

上記は、ビューをロードするための非常に単純化されたシステムです。このコードはビューを呼び出して表示します。

<?php

require_once("View.php");

use test\View;

$view = new View("views/myview.php", array("user" => "Tom"));
$view->display();

?>

このコードの私の目標は、「myview.php」のビューが次のようなコードを含めることを許可することです。

<p>
    Hello <?php echo $user; ?>!  Your E-mail is <?php echo $email; ?>
</p>

そして、上記のコードで使用されると、これは「Hello Tom!あなたの電子メールは??メールですか??」出力されます。

ただし、これは機能しません。ビューはクラスメソッドに含まれているため、$ userと$ emailを参照する場合、ビュークラスに属する変数ではなくローカル関数変数を探しています。このため、__getはトリガーされることはありません。

私はすべてのビューの変数を$ this-> userや$ this-> emailなどに変更することができますが、それは厄介で直感的ではないソリューションになります。未定義の変数が使用されている場合、PHPにエラーを投げることなく、変数を直接参照できる方法を見つけたいと思います。

考え?これを行うためのクリーンな方法はありますか、それともハッキーなソリューションに頼ることを余儀なくされていますか?

役に立ちましたか?

解決

私の答えを編集します. 。 「ハックアラウンド」のアビットですが、潜在的な解決策。エラー_handlerをより一般的な機能に「リセット」する場合があります。

view.php

<?php
error_reporting(E_ALL);
ini_set("display_errors", 0);
class View {
    function display($file, $values) {        
        set_error_handler(array($this, '__get'), E_NOTICE);        
        extract($values);
        include($file);
    }

    function __get($vaule)
    {
        echo '<i>Unknown</i>';
    }
}

$View = new View;
$values = array('user' => 'Tom',
               'email' => 'email@host.com');

$View->display('/filename.php', $values);
?>

filename.php

Hello <?php echo $user; ?>, your email is <?php echo $email; ?> and your are <?php echo $age; ?> years old.

出力

Hello Tom, your email is email@host.com and your are わからない years old.

他のヒント

使用できます エキス すべての変数をローカルスコープに引き込むには:

function display() {
    extract($this->varArray);
    include($this->filename);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top