一位朋友和我一直在skype争吵一段时间,关于像__get这样的魔术方法是否有用。
例如,假设你有一个公共/私人阵列:
class test {
private $array = ['test' => 'blah'];
public function __get($name) {
return $this->array[$name];
}
}
这是魔术方法的正确应用吗?我们正在争论,因为在php.net页面上有魔术方法,它说'不可访问的成员/属性'。我相信这意味着private
变量,虽然它可以用于在数组内部对事物进行数组化而不显式访问数组,但这不是预期用途。
答案 0 :(得分:0)
如果对象确实是“神奇的”,你只需要使用魔法。如果你有一个具有固定属性的经典对象,那么使用setter和getter,它们可以正常工作。
如果您的对象具有动态属性,例如它是数据库抽象层的一部分,并且其参数在运行时设置,那么为了方便您确实需要魔术方法。
使用魔法方法__set
和__get
:
<?php
class PropertyTest
{
private $a, $b;
public function __set($name, $value)
{
echo "Set '$name' to '$value'\n";
$this->$name = $value;
}
public function __get($name)
{
echo "Get $name \n";
return $this->$name;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
echo "<pre>\n";
$obj = new PropertyTest;
$obj->b = "Hello";
echo $obj->b . "\n\n";
?>
您可以在以下网址阅读更多内容:
使用魔术方法__call
编辑其他示例:
<?php
class Called {
private $Id, $Name;
public function __call($name, $arguments) {
$action = substr($name, 0, 3);
$field = substr($name, 3);
if($action == 'set') {
$this->$field = $arguments[0];
}
if($action == 'get') {
return $this->$field;
}
}
}
$obj = new Called();
$obj->setId(4);
echo "<br/>\n";
echo $obj->getId();
echo "<br/>\n";
$obj->setName('Peter');
echo "<br/>\n";
echo $obj->getName();
?>
您可以在以下网址阅读更多内容:
参考: