<?php
class Item {
public function __set($name, $value){
throw new Exception('Overloading is forbidden.');
}
public function __get($name){
throw new Exception('Overloading is forbidden.');
}
}
我想确保设置所有必需的对象属性,但是如果我输错了属性名称,PHP只会添加一个新属性,而我想要初始化的prop仍为null。
答案 0 :(得分:1)
来自你的评论:
我想确保设置所有必需的对象属性,但是如果我输错了属性名称,PHP只会添加一个新属性,而我想要初始化的prop将保持为null。
如果要确保设置了所有必需的对象属性,请考虑将它们作为构造函数的必需参数,例如。
class Item
{
public function __construct($required, $alsoRequired, $moreRequired)
{
// assign to corresponding properties
}
}
这样您就可以确定对象处于有效状态。
如果无法在创建对象时设置它们,请考虑向对象添加验证器方法。在对对象执行任何关键操作之前调用此方法,以确保设置所有必需的属性。与实施拼写错误保护措施相比,这对您的API来说是一个更有用的补充。
此外,如果您使用正确的setter,则不应该遇到此问题。通过界面访问对象,而不是直接分配属性。如果您输错了方法名称,PHP会告诉您(除非您实现了__call
)。
在旁注中,__get
和__set
并不是适当的Getters和Setter的延迟替换。它们是在尝试访问不可访问的属性时将触发的拦截器。这与错误处理更相关。另请注意,它们比正确的Getter和Setter慢得多。
答案 1 :(得分:0)
仅使用构造函数无法解决问题。 他描述的问题非常常见,如果调用__get或__set则抛出异常是个好主意。 如果你愿意,你可以做出最后的决定,但我认为没有理由你应该这样做。只有需要动态属性的类才会覆盖这些方法。 我可以建议的唯一改进是将方法定义包含在中 // DEBUG 和 // 的/ 完成调试后,您可以轻松地在所有代码文件上运行替换(// * DEBUG with / * DEBUG)并注释掉__get和__set
答案 2 :(得分:0)
使用http://php.net/manual/en/function.get-class-vars.php可以检查变量是否存在,例如失败时抛出异常