将导入的类名转换为完全限定的类名

时间:2018-02-01 21:16:39

标签: php namespaces

我已经获得了以下处理对象水化的代码,然后是使用array_map()的资源后代保护子资源的示例。

<?php
namespace foo\bar;

abstract class Resource {
    public static function hyrdrate($data) {
        if( ! key_exists('kind', $data) ) {
            throw new \Exception('Specified data does not have a "kind" attribute.');
        }
        list($type, $resource) = array_map('ucfirst', explode('#', $data['kind']));
        $class = sprintf('%s\%s\%s', __CLASS__, $type, $resource);
        if( ! class_exists($class) ) {
            throw new \Exception("Class $class does not exist for kind {$data['kind']}");
        }
        return new $class($data);
    }
}

namespace foo\bar\Resource\Compute;
use foo\bar\Resource;

class Instance extends Resource {
    public function getAdditionalResources() {
        return array_map(['foo\bar\Resource', 'hydrate'], $this->disks);
    }
}

问题在于,在定义array_map()的可调用内容时,我已经对完全限定的类名进行了硬编码,而不仅仅是能够使用导入的名称Resource映射到的内容。是的,我可以在技术上使用'self''parent'或切换array_map()作为此特定示例中的循环,但通常知道如何转换为完全 - 合格的班级名称是我希望在我的工具箱中拥有的。

编辑: 我能提出的最常见的案例说明了我要寻找的内容:

namespace a\b\c;
use a\b\SomeClass;
use d\e\f\MyReplacement as MyClass;

echo get_full_class_name('SomeClass'); // 'a\b\SomeClass'
echo get_full_class_name('MyClass');   // 'd\e\f\MyReplacement'

1 个答案:

答案 0 :(得分:0)

IRC的某个人终于醒来并回答我了!

@TheAlpha很接近,但是static::class只返回代码当前正在执行其上下文的类的名称。

正确答案是ClassName::class,例如:

namespace foo\bar\Resource\Compute;
use foo\bar\Resource;

echo Resource::class; // 'foo\bar\Resource'

或者:

namespace a\b\c;
use a\b\SomeClass;
use d\e\f\MyReplacement as MyClass;

echo SomeClass::class; // 'a\b\SomeClass'
echo MyClass:class;    // 'd\e\f\MyReplacement'