【发布时间】:2015-10-25 20:52:37
【问题描述】:
我不知道这是否是问这个问题的正确地方,但无论如何我都会去。最近我在 Lynda.com 上观看了一个名为“使用 PHP 进行面向对象编程”的系列文章,并谈到了关于重载的部分。在本节中,他使用了__get 和__set 魔术方法。我完全不知道这些在做什么,甚至更不知道魔法方法的目的是什么。任何帮助都会很棒!
【问题讨论】:
标签: php oop magic-methods
我不知道这是否是问这个问题的正确地方,但无论如何我都会去。最近我在 Lynda.com 上观看了一个名为“使用 PHP 进行面向对象编程”的系列文章,并谈到了关于重载的部分。在本节中,他使用了__get 和__set 魔术方法。我完全不知道这些在做什么,甚至更不知道魔法方法的目的是什么。任何帮助都会很棒!
【问题讨论】:
标签: php oop magic-methods
__set 和 __get 在您尝试设置或访问的属性未在您的类中定义或不可访问时调用。它们可用于错误处理或其他用途(例如 Eloquent ORM,它“神奇地”将表列映射到对象的属性)。
假设你有这个类:
class A {
var $a = "I'm A<br/>";
function __get($property)
{
echo "You tried to access '{$property}' which does not exist!<br/>";
} // __get
function __set($property, $value)
{
echo "You tried to set '{$property}' to '{$value}', but '{$property}' is not defined<br/>";
} // __set
}
然后,执行此操作以查看结果:
$a = new A();
echo $a->a;
$a->iDoNotExist;
$a->iDoNotExistEither = "boo!";
【讨论】:
$a->$variable = "test" 之类的东西,我就无法获得它的价值。我应该可以吗?
__set($name, $value) 正在为未定义的属性设置值,__get($name) 正在定义该属性。如果我错了,请纠正我。
var的情况下使用$a->var = "test",您需要实现__set($property, $value)方法,其主体应为$this->$property = $value。然后您将能够设置一个以前不存在的属性并稍后获取它的值(否则访问未定义的属性会返回NULL。实验一下看看。