我有factory
我希望从::class
返回TypeOneObject
。但是,工厂可能会返回几十种不同的类型(由传递给工厂的对象类型决定),名为TypeTwoObject
,$type = $myrequiredclass->getType();
return $type."Object"::class; // wanting TypeOneObject::class
等。是否可以使用变量返回类,这样的事情?
PHP Parse error: syntax error, unexpected '::'
似乎无论我如何构造这个return语句,我总是得到if/then
我知道这对于大switch
或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)
{
$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);
答案 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!