1
<?php
class classname
{
public $attribute;
function __get($name)
{
return 'here:'.$this->$name;
}
function __set ($name, $value)
{
$this->$name = $value;
}
}
$a = new classname();
$a->attribute = 5;
echo $a->attribute;

上記のスクリプトを実行すると、次のように表示されます:5

質問:

echo $a->attribute;このコード行は を呼び出しfunction __get($name)ますよね? なぜ表示されないのhere:5ですか?

4

3 に答える 3

2

プロパティを public とマークしたので、クラスの外部からプロパティにアクセスできます。

__get() は、アクセスできないプロパティからデータを読み取るために使用されます。

http://www.php.net/manual/en/language.oop5.overloading.php#object.get

__get と __set が呼び出されるように任意のプロパティを強制したい場合は、それらをプライベート マップに隠しておくことができます。

class classname
{
    private $vars = array();
    function __get($name)
    {
        return 'here:'.$this->vars[$name];
    }
    function __set ($name, $value)
    {
        $this->vars[$name] = $value;
    }
}
于 2013-07-22T02:55:51.510 に答える
1

マジック __get および __set および __call は、プロパティ プロパティまたはメソッドが未定義であるか、呼び出しスコープからアクセスできない場合、または未定義である場合にのみ呼び出されます。

これを機能させるには、属性への公開参照を削除するか、保護または非公開にする必要があります。

class classname
{
  protected $attribute;
  function __get($name)
  {
    return 'here:'.$this->$name;
  }
  function __set ($name, $value)
  {
    $this->$name = $value;
  }
}
$a = new classname();
$a->attribute = 5; //  calling __set
echo $a->attribute; // calling __get
于 2013-07-22T02:56:04.037 に答える
0

ここで 'attribute' は public であるため、__get() マジック メソッドは呼び出されません。

于 2013-07-22T02:56:44.013 に答える