有没有更好的方法来阻止属性重载?

时间:2010-12-14 08:37:35

标签: php oop overloading

<?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。

3 个答案:

答案 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可以检查变量是否存在,例如失败时抛出异常