2 回答

TA贡献1784条经验 获得超7个赞
您可以做到这一点的一种方法是使用 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";

TA贡献1784条经验 获得超8个赞
您可以为此使用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 效率低下并且可能非常危险。在考虑使用它之前,请先查阅文档。
最好重新考虑您的用例。从字面上看,我想不出什么需要完全动态的类名。如果此时您将库导入代码库,您应该知道预期的类名,此时您可以使用该名称的类扩展您的父类。
- 2 回答
- 0 关注
- 132 浏览
添加回答
举报