别名在php中不存在的类名

考虑以下代码:


 use ReplacementClass;


 class A extends ReplacementClass {


 }

此代码中的ReplacementClass名称应该只是一个占位符,一个未定义的、不存在的类。在运行时或运行之前,我想为这个不存在的类加上一个动态设置的现有类的别名,以使我的代码能够工作。PHP中有什么方法可以做到这一点吗?


为什么我要实现这一点,是A在上面的示例中定义的,是项目插件中的一个类,我想使其可移植,所以ReplacementClass在原始插件中也是如此。我想为团队保留一个选项,以扩展这些类,并向它们添加新功能,这些仅在他们正在处理的特定项目中需要。


在上述情况下,如果这两个都是真正的类,我可以用 扩展一个B类A,并在 中添加新功能B,我也可以ReplacementClassSpecific用扩展ReplacementClass并为其添加新功能,但是鉴于 PHP 的单继承,我不能不要同时扩展。


UYOU
浏览 133回答 2
2回答

噜噜哒

您可以做到这一点的一种方法是使用 class_exists,如果它不存在,则添加一个虚拟占位符。但理想情况下,我建议您研究 Laravel 使用的 Facades。通过这种方式,您可以灵活地实现,而无需依赖继承。在线查看https://ideone.com/pWf8QU/* // unhide this to see the two behaviours  class ReplacementClass {    public function foo() {        return "foo";    }    public function bar() {        return "bar";    }}*/if(!class_exists('ReplacementClass')) {   class MyReplacementClass {     public function foo() {        echo " foo does not exist, this is a placeholder";     }     public function bar() {        echo " bar does not exist, this is a placeholder";     }   }}else {   class MyReplacementClass extends ReplacementClass {   }}class FooBar extends MyReplacementClass {}$x = new FooBar();echo $x->foo() . $x->bar() . "\n";

青春有我

您可以为此使用eval()。但这很脏。eval("class $className extends $parentClassName {}");例子class Foo {}$className = 'Bar';$parentClassName = 'Foo';eval("class $className extends $parentClassName {}");$bar = new Bar();var_dump($bar); // gives 'object(Bar)#1 (0) {}'var_dump($bar instanceof Bar); // gives bool(true)var_dump($bar instanceof Foo); // gives bool(true)警告!使用 eval 效率低下并且可能非常危险。在考虑使用它之前,请先查阅文档。最好重新考虑您的用例。从字面上看,我想不出什么需要完全动态的类名。如果此时您将库导入代码库,您应该知道预期的类名,此时您可以使用该名称的类扩展您的父类。
打开App,查看更多内容
随时随地看视频慕课网APP