php null对象与默认空值

时间:2013-03-13 22:56:28

标签: php oop

我刚刚阅读了一篇关于Null对象模式(http://phpmaster.com/the-null-object-pattern-polymorphism-in-domain-models/)的精彩文章,我正计划将其实现到现有代码中。

我的问题是,一个全新的'null class'是最好的方法吗?以前我在构造函数中将默认值设置为NULL。然后我可以创建该类的空壳。例如:

class person{

    private $_personId;
    private $_name;
    private $_email;
    private $_phone;

    public function __construct($_personId, $_name, $_email, $_phone = NULL){
        //set the vars here
    }

}

然后,如果我想要一个真实的物体,我会这样做:

$person = new person(1, 'John Doe', 'doe@gmail.com');

如果我想要一个'null'对象,我会这样做:

$person = new person(NULL, NULL, NULL);

这种方法有什么缺陷吗?

2 个答案:

答案 0 :(得分:4)

您没有按照文章中讨论的模式进行操作。 Null Object 的原则是扩展您的主要Domain对象。会是这样的:

class Person {
    // atributes and methods...
}

class PersonNull extends Person {

}

答案 1 :(得分:1)

我鼓励您考虑探索Factory模式 - 也就是说,在Person中创建几个静态方法,它们可以根据传递的参数返回Person对象。例如:

class Person {
 public static createWithName($name) {
   $obj = new Person();
   $obj->_name = $name;
   return $obj;
 }

 public static createWithNameAndEmail($name, $email) {
   $obj = new Person();
   $obj->_email = $name;
   $obj->_name = $email;
   return $obj;    
 }

 ....
}

/* 
   And then instead of $objPerson = new Person('Bob', null, null, null)
   you would instantiate an object like this:
*/
$objPerson = Person::createWithName('Bob')

这将允许您进行所需的所有验证,并通过方法声明帮助您记录有效的参数类型。有关工厂模式的更多信息:http://phpmaster.com/understanding-the-factory-method-design-pattern/