Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php OOP实践“空”对象_Php_Oop - Fatal编程技术网

Php OOP实践“空”对象

Php OOP实践“空”对象,php,oop,Php,Oop,使用空实例是一种好的做法还是一种坏的做法 有一个产品类别,由id启动: class product { __construct($id = 0) { // populate class, there is no product with id = 0 } function new($name, $data) ... } $product = new Product(123); // normal using 但我还需

使用空实例是一种好的做法还是一种坏的做法

有一个产品类别,由id启动:

class product
{
    __construct($id = 0)
    {
        // populate class, there is no product with id = 0
    }

    function new($name, $data)
            ...
}


$product = new Product(123); // normal using
但我还需要创建新产品,因此没有初始对象,我创建了一个空对象:

$product = new Product();
$product->new($name, $data);
是好还是坏? 可能我应该在product类之外创建普通函数new_product,因为它不使用它的实例,只创建空的。
解决此问题的最佳做法是什么?

格式错误。实际上,您给出了一个名称混乱的setter方法


您还将构造函数初始化与setter初始化混合在一起。选择其中一个,但不能同时选择两个

糟糕的形式。实际上,您给出了一个名称混乱的setter方法


您还将构造函数初始化与setter初始化混合在一起。选择其中一个,但不能同时选择两个

两者都可能是好的做法。也许你对第二个的实现不是很好

事实上,第二个是工厂模式的简单实现。查看此链接,您将更好地了解:


也许工厂方法应该在像ProductFactory这样的类中,所以,ProductFactory->new。。。这将是拥有伟大工厂的最佳方式

两者都可能是好的做法。也许你对第二个的实现不是很好

事实上,第二个是工厂模式的简单实现。查看此链接,您将更好地了解:


也许工厂方法应该在像ProductFactory这样的类中,所以,ProductFactory->new。。。这将是拥有伟大工厂的最佳方式

如果我正确地理解你,并且正确地遵循了你的方法,你很可能想要这样的东西。这样,您就不需要创建Product类的实例来创建新产品

class Product {
    public function __construct($id = 0) {
        // Load the data for existing product with Id > 0
    }

    public static function create($name, $data) {
        // Create a new product from scratch
        $obj = new self();
        $obj->Name = $name;
        // Do something with data
        return $obj;
    }
}

// Load a product
$product = new Product(123);

// Creating a product
$product = Product::Create('My new product', /* Data? Possible an array */);

如果我正确地理解你,并且正确地遵循了你的方法,你很可能想要这样的东西。这样,您就不需要创建Product类的实例来创建新产品

class Product {
    public function __construct($id = 0) {
        // Load the data for existing product with Id > 0
    }

    public static function create($name, $data) {
        // Create a new product from scratch
        $obj = new self();
        $obj->Name = $name;
        // Do something with data
        return $obj;
    }
}

// Load a product
$product = new Product(123);

// Creating a product
$product = Product::Create('My new product', /* Data? Possible an array */);

理想情况下,对象的状态应始终为。这通常更多的是内部状态,而不是外部可见状态,但是您可以在这里应用这个概念。如果名称或数据为空,或者ID为0无效如果ID为的标记在持久性存储中不存在,那么它是有效的,那么它不是最佳做法。坚持让代码保持对象有效而不是程序员有效的原因是这样做依赖于程序员阅读类的文档。当有人在他们的电子商务网站上使用你的课程,通过电子邮件向你投诉他们收到的订单中有空白项时,你会看到这种方法的智慧

为了实现在PHP中始终保持有效状态的最佳实践,您可以使用Matías提到的factory模式,或者简单地在产品上使用静态方法来创建比factory模式稍微简单的产品;这些方法在技术上只是构造器。或者,您可以使用手动实现构造函数重载,检查参数并根据参数的不同采取不同的操作。这将在运行时而不是编译时捕获调用错误,并且在这方面不如其他方法


当然,对于在脚本执行期间丢失某些属性的产品来说,这可能是完全有效的,但是对于存储对象来说,丢失这些属性则是无效的。如果是这种情况,存储/检索产品的代码将强制执行非空属性。

理想情况下,对象的状态应始终为空。这通常更多的是内部状态,而不是外部可见状态,但是您可以在这里应用这个概念。如果名称或数据为空,或者ID为0无效如果ID为的标记在持久性存储中不存在,那么它是有效的,那么它不是最佳做法。坚持让代码保持对象有效而不是程序员有效的原因是这样做依赖于程序员阅读类的文档。当有人在他们的电子商务网站上使用你的课程,通过电子邮件向你投诉他们收到的订单中有空白项时,你会看到这种方法的智慧

为了实现在PHP中始终保持有效状态的最佳实践,您可以使用Matías提到的factory模式,或者简单地在产品上使用静态方法来创建比factory模式稍微简单的产品;这些方法在技术上只是构造器。或者,您可以使用手动实现构造函数重载,检查参数并根据参数的不同采取不同的操作。这将在运行时而不是编译时捕获调用错误,并且在这方面不如其他方法

当然,对于在脚本执行期间丢失某些属性的产品来说,这可能是完全有效的,但是对于存储对象来说,丢失这些属性则是无效的。
如果是这种情况,存储/检索产品的代码将强制执行非空属性。

等等,那么,您正在使用实例创建实例,什么?如果不创建实例,我如何获得新属性?使用静态函数?它应该是这样的吗?等等,那么,你正在使用一个实例来创建一个实例,什么?如果不创建实例,我如何获得新的实例?使用静态函数?应该是这样吗?