从php工厂返回变量类名
我有一个从php工厂返回变量类名,php,factory,Php,Factory,我有一个工厂,我想从中返回一个::类。但是,工厂可能会返回几十种不同的类型(由传入工厂的对象类型决定),名为TypeOneObject,TypeTwoObject等。是否可以使用类似这样的变量返回类 $type = $myrequiredclass->getType(); return $type."Object"::class; // wanting TypeOneObject::class 似乎无论我如何构造这个返回语句,我总是得到PHP解析错误:语法错误,意外的“:” 我知道用一个
工厂
,我想从中返回一个::类
。但是,工厂可能会返回几十种不同的类型(由传入工厂的对象类型决定),名为TypeOneObject
,TypeTwoObject
等。是否可以使用类似这样的变量返回类
$type = $myrequiredclass->getType();
return $type."Object"::class; // wanting TypeOneObject::class
似乎无论我如何构造这个返回语句,我总是得到PHP解析错误:语法错误,意外的“:”
我知道用一个大的if/then
或开关
很容易,但我想避免这样
下面是一个更加充实的场景:
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();
从
$type
实例获取类名的最佳方法是使用php函数。这将获得类实例中的所有方法。从那里我们可以过滤并使用call\u user\u 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
实例获取类名的最佳方法是使用php函数。这将获得类实例中的所有方法。从那里我们可以过滤并使用call\u user\u 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.“Object”}::类
或可能与()
一起?A有助于简化测试。$myrequiredclass
中有什么?$type::class
您认为::class
位在那里做什么?只需将其删除,并在最后一行添加一个echo
,就可以了。话虽如此,我看不出本例中工厂的用途。{$type.“Object”}::class
或可能与()
?A有助于简化测试。$myrequiredclass
中有什么?$type::class
您认为::class
位在那里做什么?只需将其删除,并在最后一行添加一个echo
,就可以了。话虽如此,我看不出这个例子中工厂的用途。