何时在PHP中使用魔术方法?

时间:2015-03-18 02:33:17

标签: php class oop instance magic-methods

一位朋友和我一直在skype争吵一段时间,关于像__get这样的魔术方法是否有用。

例如,假设你有一个公共/私人阵列:

class test {
    private $array = ['test' => 'blah'];

    public function __get($name) {
        return $this->array[$name];
    }
}

这是魔术方法的正确应用吗?我们正在争论,因为在php.net页面上有魔术方法,它说'不可访问的成员/属性'。我相信这意味着private变量,虽然它可以用于在数组内部对事物进行数组化而不显式访问数组,但这不是预期用途。

1 个答案:

答案 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();

?>

您可以在以下网址阅读更多内容:

参考: