【发布时间】:2018-02-02 08:50:01
【问题描述】:
我有以下处理对象水合的代码,然后是一个使用 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'
【问题讨论】:
-
哪个版本,可以用
static::class吗? -
@TheAlpha 将返回
foo\bar\Resource\Compute\Instance -
是的,那你想要什么?
-
@TheAlpha 我用一个简化的例子编辑了这个问题。
-
@TheAlpha 你很亲密!显然
Resource::class做了我想做的事。
标签: php namespaces