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语法的这一方面是$
在类中的字段声明之前,但在访问该字段时没有.这是由语法来访问静态字段,这加剧确实需要$
!