1

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

我的问题是,一个全新的“空类”会是最好的方法吗?以前我在构造函数中将默认值设置为 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');

如果我想要一个“空”对象,我会这样做:

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

这种方法有什么陷阱吗?

4

2 回答 2

4

您没有遵循本文中讨论的模式。Null Object的原理是扩展您的主要域对象。会是这样的:

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

class PersonNull extends Person {

}
于 2015-03-27T17:59:48.623 回答
1

我鼓励您考虑探索工厂模式——也就是说,在 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/

于 2013-03-14T00:01:01.363 回答