2

如果之前有人问过这个问题,请原谅,但我尝试搜索它没有令人满意的结果。

我正在学习 PHP(来自 C++ 背景)并且遇到了以下歧义。以下两位代码的工作方式完全相同:

class A
{
    public $myInteger;
    public function __get($name) 
    { 
        return $this->$name; 
    }
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}

class A
{
    public $myInteger;
    public function __get($name) 
    { 
        return $this->name; 
    }
    public function __set($name, $value)
    {
        $this->name = $value;
    }
}

也就是在类中的方法$this->$name$this->name具有完全相同的功能。我发现这有点令人困惑,尤其是考虑到如果您添加以下代码,

$myA = new A();
$myA->myInteger = 5;
$hereInt = $myA->myInteger;

echo "<p>" . $hereInt . "</p>";

只有在没有$before时才有效myInteger。有人可以解释一下这背后的理由吗?

4

1 回答 1

10

$this->$name并不意味着$this->name同样的事情。第一个是使用本地范围的变量来访问其名称是包含任何内容的字段,而第二个是直接访问该字段。$name$this$namename

例如,以下将输出something

$foo = new stdClass;
$foo->bar = 'something';

$baz = 'bar';
echo $foo->$baz;

在 和 的情况下,__get包含在调用站点访问的属性的名称;在你的情况下,。__set$namemyInteger

在您的示例中,__getand__set方法实际上是多余的,因为$myA->myInteger它是公共的并且可以直接访问。__get并且__set只需要捕获对未在类中显式声明的属性的访问尝试。

例如,您可能有一个允许动态设置任意“属性”的支持数组:

class Foo
{
    private $_values = array();

    public function __get($key)
    {
        if (isset($this->_values[$key]))
        {
            return $this->_values[$key]
        }
    }

    public function __set($key, $value)
    {
        $this->_values[$key] = $value;
    }
}

PHP 语法的这一方面有点令人困惑的一点是,a$在类中的字段声明之前,但在访问该字段时没有。这与访问静态字段的语法相得益彰,它确实需要一个$!

于 2011-02-07T12:34:58.983 回答