从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
,就可以了。话虽如此,我看不出这个例子中工厂的用途。