Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据变量更改父类_Php_Oop - Fatal编程技术网

Php 根据变量更改父类

Php 根据变量更改父类,php,oop,Php,Oop,如何根据某些语句设置父类 范例 $switcher = true; if($switcher) { class a extends class1{ ... } else { class a extends class2 { ... } 我需要这样的东西 $myclass = $switcher ? 'class1' : 'class2'; class a extends $myclass { //sure this will not work 但是如何使用$myclass而不使用

如何根据某些语句设置父类

范例

$switcher = true;

if($switcher) {
 class a extends class1{
 ...
}
else {
 class a extends class2 {
 ...
}
我需要这样的东西

$myclass = $switcher ? 'class1' : 'class2';

class a extends $myclass { //sure this will not work
但是如何使用
$myclass
而不使用
eval


谢谢

类是在编译时解析的,而不是在运行时,所以实际上您不能。考虑使用不同的父母们创建2个类,并根据您的代码> $Cwitter 动态地实例化它们。在运行时尝试更改继承层次结构没有多大意义


您预期的方法似乎迫切需要重新思考体系结构。如果
class1
class2
是不同的类,那么根据定义,它们不应该有太多的共同点,可以与下游子类互换,如果它们确实有很多共同点,则可能指向继承继承权中更高的问题,其中一个可能需要从另一个继承。

常识方法是声明两个类,我们称它们为
A1
A2
,一个扩展
Class1
,另一个扩展
Class2
。然后,您决定要实例化哪一个


但是,如果没有
eval
,您就无法准确地执行您想要的操作。PHP支持匿名函数和闭包,但不支持匿名类。

您可以这样做:

class MyCommon {}
class MyClassA extends MyCommon {}
class MyClassB extends MyCommon {}

$switcher = true;

if ($switcher) {
    $myinstance = new MyClassA();
} else {
    $myinstance = new MyClassB();
}

var_dump($myinstance instanceof MyCommon); // true, because of inheritance
var_dump($myinstance instanceof MyClassA); // true
var_dump($myinstance instanceof MyClassB); // false
var_dump(get_class($myinstance)); // "MyClassA"

斯盖里!只是:不要这样做!:)根据你真正想要实现的目标,有很多真正的解决方案。最简单的是一个非常常见的依赖关系:)
classa{public function}u构造(行为$b){/*您的代码*/}}$a=newa(新行为1)