gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:06:56 25 4
gpt4 key购买 nike

我有以下处理对象水化的代码,然后是使用 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'

最佳答案

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'

关于php - 将导入的类名转换为完全限定的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com