可能重复:
魔术方法是PHP的最佳实践吗?
这些都是简单的例子,但想象一下你的班级中有两个以上的属性.
什么是最佳做法?
a)使用__get和__set
class MyClass {
private $firstField;
private $secondField;
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
}
}
$myClass = new MyClass();
$myClass->firstField = "This is a foo line";
$myClass->secondField = "This is a bar line";
echo $myClass->firstField;
echo $myClass->secondField;
/* Output:
This is a foo line
This is a bar line
*/
Run Code Online (Sandbox Code Playgroud)
b)使用传统的二传手和吸气剂
class MyClass {
private $firstField; …Run Code Online (Sandbox Code Playgroud) 除非我完全弄错了,否则这些__get和__set方法应该允许重载→ get和set.
例如,以下语句应调用该__get方法:
echo $foo->bar;
$var = $foo->bar;
Run Code Online (Sandbox Code Playgroud)
以下应该使用该__set方法:
$foo->bar = 'test';
Run Code Online (Sandbox Code Playgroud)
这在我的代码中不起作用,并且可以通过这个简单的示例重现:
class foo {
public $bar;
public function __get($name) {
echo "Get:$name";
return $this->$name;
}
public function __set($name, $value) {
echo "Set:$name to $value";
$this->$name = $value;
}
}
$foo = new foo();
echo $foo->bar;
$foo->bar = 'test';
echo "[$foo->bar]";
Run Code Online (Sandbox Code Playgroud)
这只会导致:
[test]
Run Code Online (Sandbox Code Playgroud)
die()在那里打几个电话表明它根本没有打它.
现在,我只是说它,并且我手动使用__get它现在需要的地方,但这不是非常动态,并且需要知道"重载"代码实际上没有被调用,除非特别调用.我想知道这是不应该以我理解它应该或为什么这不起作用的方式起作用.
这是在运行php 5.3.3.