我刚刚阅读了一篇关于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);
这种方法有什么缺陷吗?
答案 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/