【问题标题】:Translate imported class name to fully-qualified class name将导入的类名转换为完全限定的类名
【发布时间】: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


【解决方案1】:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 2018-02-27
    • 2012-10-12
    • 2011-11-08
    • 1970-01-01
    • 2021-03-25
    • 2010-09-20
    • 2014-06-04
    相关资源
    最近更新 更多