我已经获得了以下处理对象水化的代码,然后是使用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'
答案 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'