PHP中$ this - > $ variable的模糊语法

Kri*_*ato 2 php oop syntax class ambiguity

如果之前已经问过这个问题,请原谅我,但是我试着搜索它并没有令人满意的结果.

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

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

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

也就是说,在类的方法$this->$name,并$this->name具有完全相同的功能.我发现这有点令人困惑,特别是考虑到如果你添加以下代码,

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

echo "<p>" . $hereInt . "</p>";
Run Code Online (Sandbox Code Playgroud)

只有$在以前没有的情况下才有效myInteger.有人可以解释一下这背后的理由吗?

Wil*_*den 10

$this->$name$this->name意味着同样的事情.第一种是使用本地范围的变量$name来访问$this其名称是$name包含的name字段的字段,而第二种是直接访问字段.

例如,以下内容将输出something:

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

$baz = 'bar';
echo $foo->$baz;
Run Code Online (Sandbox Code Playgroud)

在的情况下,__get__set,$name包含在调用站点访问的属性的名称; 在你的情况下,myInteger.

在您的示例中,__get__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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有一点令人困惑的是,PHP语法的这一方面是$在类中的字段声明之前,但在访问该字段时没有.这是由语法来访问静态字段,这加剧确实需要$!