从php工厂返回变量类名

时间:2016-11-23 18:44:33

标签: php factory

我有factory我希望从::class返回TypeOneObject。但是,工厂可能会返回几十种不同的类型(由传递给工厂的对象类型决定),名为TypeTwoObject$type = $myrequiredclass->getType(); return $type."Object"::class; // wanting TypeOneObject::class 等。是否可以使用变量返回类,这样的事情?

PHP Parse error:  syntax error, unexpected '::'

似乎无论我如何构造这个return语句,我总是得到if/then

我知道这对于大switchclass TypeOneObject { public static function whoAreYou() { return 'Type One Object!'; } } class MyRequiredClass { public function getType() { return 'TypeOne'; } } class MyFactory { public static function getFactoryObject(MyRequiredClass $class) { $type = $class->getType()."Object"; return $type::class; } } $object = MyFactory::getFactoryObject(new MyRequiredClass()); $object::whoAreYou(); 来说很容易,但我想避免这样做。

这是一个更加充实的场景:

PackageManager p = getPackageManager();
                p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

1 个答案:

答案 0 :(得分:0)

$type实例获取类名的最佳方法是使用php get_class_methods函数。这将为我们提供类实例中的所有方法。从那里我们可以过滤并使用call_user_func来调用方法并获得正确的值。

class TypeOneObject
{
    public static function whoAreYou()
    {
        return 'Type One Object!';
    }
}

class MyRequiredClass
{
    public function getType()
    {
        return 'TypeOne';
    }
}

class MyFactory
{
    public static function getFactoryObject(MyRequiredClass $class)
    {
        $methods = get_class_methods($class);
        $method = array_filter($methods, function($method) {
            return $method == 'getType';
        });

        $class = new $class();
        $method = $method[0];
        $methodName = call_user_func([$class, $method]);
        $objectName = sprintf('%sObject', $methodName);

        return new $objectName;  
    }
}

$object = MyFactory::getFactoryObject(new MyRequiredClass());
echo $object::whoAreYou();

<强>输出

Type One Object!