PHP中$ this-> $变量的模糊语法

时间:2011-02-07 12:31:28

标签: php oop class syntax ambiguity

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

我正在学习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>";
如果$之前没有myInteger,则

。有人可以解释一下这背后的理由吗?

1 个答案:

答案 0 :(得分:9)

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

例如,以下内容将输出something

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

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

对于__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;
    }
}

对于PHP语法的这一方面,有一点令人困惑的是,$在类中的字段声明之前,但在访问该字段时没有。访问静态字段的语法更加复杂, 需要$