如果之前已经提出过这个问题,请原谅我,但是我试着搜索它并没有令人满意的结果。
我正在学习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
,则仅 。有人可以解释一下这背后的理由吗?
答案 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语法的这一方面,有一点令人困惑的是,$
在类中的字段声明之前,但在访问该字段时没有。访问静态字段的语法更加复杂, 需要$
!