Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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_Class_Object_Variable Variables - Fatal编程技术网

PHP中的变量类扩展——可能吗?

PHP中的变量类扩展——可能吗?,php,class,object,variable-variables,Php,Class,Object,Variable Variables,在PHP中是否可以执行以下操作 $blah = 'foo1'; class foo2 extends $blah { //... } class foo1 { //... } 这是一个错误 我想动态地设置$blah,这样我就可以扩展我想要的任何类 编辑:之所以要这样做,是因为我想使用相关类中另一个类的函数。最终会是这样的: Final extends foo1 extends foo2 extends foo3 extends foo4 extends parent { .

在PHP中是否可以执行以下操作

$blah = 'foo1';

class foo2 extends $blah {
    //...
}

class foo1 {
    //...
}
这是一个错误

我想动态地设置$blah,这样我就可以扩展我想要的任何类

编辑:之所以要这样做,是因为我想使用相关类中另一个类的函数。最终会是这样的:

Final extends foo1 extends foo2 extends foo3 extends foo4 extends parent { ... }

最后,我决定在类中实例化另一个类并使用它。这不是最好的选择,因为它们都是同一个类中的两个,但这不会经常被使用,所以现在就可以了

我不认为这会特别有用,但要回答你的问题。。。没有。没有办法动态地这样做,因为必须在计算变量之前实例化生成的类(如果有意义的话)


简单地说:类必须存在,才能正确执行代码。

这里假设php从上到下执行,但它的工作方式不是这样的:

<?php
foo();  # works

function foo(){
  print "bar";
}

我想这是为了便于维护,对吧?在运行时扩展类真的很疯狂

class SuperClassOne { /* code */ }
class SuperClassTwo { /* code */ }

class IntermediateClass extends SuperClassOne { /* empty! */ }

class DescendantClassFoo extends IntermediateClass{ }
class DescendantClassBar extends IntermediateClass{ }
class DescendantClassBaz extends IntermediateClass{ }
然后,当您想要更改所有
子类*
类时,您只需更改中间类扩展的内容:

class IntermediateClass extends SuperClassTwo { }

如果$blah的值不太多,可以在不同的文件中扩展每个值,然后
require_once“classes/foo_u$blah.php”


否则,您将不得不使用
eval()
解决方案。。。祝你好运……:)

你应该试试看$$

$blah = 'foo1';
class foo2 extends $$blah {
    //...
}

class foo1 {
    //...
}

我用声音和吠声测试了一些东西:

<?php
    define("INHERIT",A);

    class A{
        public function bark(){
            return "I'm A";
        }
    }
    class B{
        public function bark(){
            return "I'm B";
        }
    }

    class C extends INHERIT{}

    //main?
    $dog = new C();
    echo $dog->bark();
?>

我知道这个问题很久以前就被问过了,但答案相对简单

假设您想要在类foo存在时扩展类foo,或者在类bar不存在时扩展类foo,那么您应该使用:

if(!class_exists('foo')) {
    class foo extends bar {
        function __construct() {
            parent::__construct();
        }
    }
}

class myclass extends foo{
    //YOUR CLASS HERE
}
使用您可以在一定程度上实现这一点

class variable_class {
    public $orginalBaseClass;
    public $orginalArgs;

    public function __construct() {
        // Get constructor parameters.
        $this->orginalArgs = func_get_args();
        // Get class name from args or 3rd party source.
        $classname = 'stdClass';

        // Pass along args to new class.
        $this->orginalBaseClass = new $classname($this->orginalArgs);
    }

    public function __call($name, $arguments) {
        // Pass all method calls to the orginalBaseClass.
        return call_user_func_array(array($this->orginalBaseClass, $name), $arguments);
    }
}

我在for中使用了这种模式。

我的感觉也一样。但是使用PHP,您永远不会知道…;-)正如肯特·弗雷德里克所说,这是可能的。不漂亮但可能。单行注释使用不当。结束括号}已注释!但是,您可以创建一个可以从任何对象继承的类,方法是继承一个在数组中具有类列表的MultipleInherter类,然后它在静态上下文中使用_调用调用方法,以便将方法中的$this转换为当前类。只有公共方法才能工作,所以这是一个真正的假继承。然后调用extend()方法并向列表中添加一个类。在理想情况下,人们不想这样做。但这不是一个理想的世界。我查了一下,因为Joomla一直在修改父类,以便在1.5.x版和更高版本之间定义新的“元素”。我的子类不需要不同,也不需要不同的代码基,因此我希望能够根据Joomla的版本从不同的类继承。这就是为什么。似乎PHP不可能使用泛型,令人失望的是,我想到了用这种方式来破解它@user185631来到这里的原因与此完全相同。你为什么要在运行时扩展另一个类?测试、模拟静态方法:(@Abdillah PHP对于这里的工作来说是错误的工具。将eval放入混合中的原因为安全漏洞带来了深不可测的风险。也就是说,你仍然可以这样做,但不要欺骗自己,你所做的是“好的”无论如何,请确保您不想在生产堆栈中使用该代码,这只是一种预防措施。这是一个可行的想法……如果有5个可能的类您可能希望从中进行扩展,这可能会有点糟糕。同意,但从您的一条评论来看,您似乎是在为Joomla开发。我假设您尝试扩展的类是否可用,取决于Joomla的版本,因此我猜测可能的类将限于两个左右。不幸的是,没有简单的方法(据我所知)使用变量来代替类名,也就是说,您无法编写类myclass扩展$classvar{}所以这是最好的选择。虽然你是对的…5+个可能的类它会变得丑陋!没有必要向foo添加_构造。这不起作用。请参阅
class IntermediateClass extends SuperClassTwo { }
$blah = 'foo1';
class foo2 extends $$blah {
    //...
}

class foo1 {
    //...
}
<?php
    define("INHERIT",A);

    class A{
        public function bark(){
            return "I'm A";
        }
    }
    class B{
        public function bark(){
            return "I'm B";
        }
    }

    class C extends INHERIT{}

    //main?
    $dog = new C();
    echo $dog->bark();
?>
if(!class_exists('foo')) {
    class foo extends bar {
        function __construct() {
            parent::__construct();
        }
    }
}

class myclass extends foo{
    //YOUR CLASS HERE
}
class variable_class {
    public $orginalBaseClass;
    public $orginalArgs;

    public function __construct() {
        // Get constructor parameters.
        $this->orginalArgs = func_get_args();
        // Get class name from args or 3rd party source.
        $classname = 'stdClass';

        // Pass along args to new class.
        $this->orginalBaseClass = new $classname($this->orginalArgs);
    }

    public function __call($name, $arguments) {
        // Pass all method calls to the orginalBaseClass.
        return call_user_func_array(array($this->orginalBaseClass, $name), $arguments);
    }
}