Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 让一个对象决定它的类_Php_Design Patterns_Instantiation - Fatal编程技术网

Php 让一个对象决定它的类

Php 让一个对象决定它的类,php,design-patterns,instantiation,Php,Design Patterns,Instantiation,很抱歉,我想不出一个更具描述性的标题。我的问题如下。假设您有两个类A和B,并且您知道有时可能会发生一些代码试图实例化类型A的对象,而实际需要的是类型B的对象。关键是决定哪一个是正确对象的代码自然属于类A而不是客户机代码 在javascript中(好的,js没有类,但它清楚地表明了这一点),您只需 function A() { if(some_condition) { return new B(); } //else we proceed to custom

很抱歉,我想不出一个更具描述性的标题。我的问题如下。假设您有两个类A和B,并且您知道有时可能会发生一些代码试图实例化类型A的对象,而实际需要的是类型B的对象。关键是决定哪一个是正确对象的代码自然属于类A而不是客户机代码

在javascript中(好的,js没有类,但它清楚地表明了这一点),您只需

function A() {
    if(some_condition) {
        return new B();
    }
    //else we proceed to customize and return our object
}
我想在PHP中做一些类似的事情。我能想到的最好的办法是

class A {
    private function __construct() {
        //whatever you need to do
    }

    public static function getInstance() {
        if(some_condition) {
            return new B();
        }
        else {
            return new A();
        }
    }
}
问题是,客户机代码必须始终知道A是特殊的,并且必须使用静态方法实例化对象


有没有一种方法可以将要无缝返回的对象类型的选择委托给代理?

不幸的是,没有,我认为您能做的最好的事情是:

class Decider {

    public static function decide() {
        if(some_condition) {
            return "A";
        }
        else {
            return "B";
        }
    }
}

$new_class = Decider::decide();

$new_object = $new_class();
但是,这和你处理问题的方式没有什么不同。虽然我不认为这是一个无效的设计模式,但是我会把它留给一个外部类来做决定,而不是让类“A”或“B”类来做决定。理想情况下,类的封装方式应确保它们不需要其他类,除非它们是类本身的成员变量或出于函数目的传递到类中