2012-02-20 8 views
0

次の例なぜ__getはエコーを無視しますか?

class Employee 
{ 
    var $name; 
    var $city; 
    protected $wage; 
    function __get($propName) 
    { 
     echo "__get called!<br />"; 
     $vars = array("name","city"); 
     if (in_array($propName, $vars)) 
     { 
      return $this->$propName; 
     } else { 
      return "No such variable!"; 
     } 
    } 
} 
$employee = new Employee(); 
$employee->name = "Mario"; 
echo $employee->name."<br />"; 
echo $employee->age; 

では、出力は次のようになります。

Mario 
__get called! 
No such variable! 

...私がいることを理解して、私を混乱させる "__getと呼ばれます!" $ employee-> nameにアクセスしたときに表示されますが、$ employee-> ageにアクセスしても表示されないのはなぜですか?つまり、そこにはありますが、__getはif-else文でのリターンだけを考慮しているようです。そんなことがあるものか?

観測:__getは、読み込み時に$ ageが存在しないことを検出したときに実行されますが、実行されると、なぜエコーは機能しませんか?

結論: "__get called!" $ employee-> ageが読み込まれる__getという1回の呼び出しのために現れました。

+1

動作します。あなたが "__get called!"と表示されたら、それはアクセス不可能なプロパティ( 'age')にアクセスしているためにエコーされています。 '$ name'は一般にアクセス可能なプロパティなので、' __get() 'は決してその行に呼び出されません。 –

答えて

4

あなたの前提が間違っています。

私は "__get called!"と理解しています。 $ employee-> nameにアクセスしたときに表示されます

いいえ、それはありません。 __getは、が存在しないメンバーにアクセスしようとしたときにのみ呼び出されます。。あなたは$nameという名前の一般にアクセス可能なメンバーを定義しました。これは、var $nameの行です。 $employee->nameへの読み取り/書き込みはとなりません。は、魔法__getまたは__set_のメソッドを呼び出します。

は、"__get called"を印刷していません。 $employee->name"Mario"、そのメンバーに割り当てた値、が返されます。は印刷されています。 $employee->ageで、"__get called"が印刷されています。

私はより良いラインと彼らが__getに関してで行うを説明しようとしました:

$employee = new Employee(); 
$employee->name = "Mario";  # assign to $name 
echo $employee->name."<br />"; # read "Mario" from $name, does NOT invoke __get 
echo $employee->age;   # attempt to read $age, invokes __get 

RE:あなたの観察

観察:もちろん、それは$の年齢を検出したときに実行さ__get読んだときには存在しませんが、実行されると、なぜそのエコーは機能しませんか?

エコーになります。 "__get called!"が表示されているのは、$employee->ageにアクセスしようとすると、__getが1回しか呼び出されないためです。

+0

私はあなたのポイントを参照してください。 –

2

__get()オブジェクトのプロパティにアクセスするときに呼び出されません。プロパティが直接読まれる:あなたは$employee->ageを読むときに

+0

明らかに....しかし、それは私の質問ではありませんでした。 –

+0

ええ、私は本当に読んでいませんでした:( – Vitamin

2

$nameがそう__getはそれのために呼び出されていない、$employeeの財産である(あなたのオブジェクトの既存のプロパティではありません)を実行います。

したがって、__getは、ageに対して1回呼び出されています。

+0

メインポストで追加した観測を読んでください。 –

+0

@ AndrewG.H。私の答えは明確にするように更新しました。時間。 – Borealid

関連する問題