php扩展,但使用新的构造函数…可能吗?

php扩展,但使用新的构造函数…可能吗?,php,Php,我有一门课: class test { function __construct() { print 'hello'; } function func_one() { print 'world'; } } 我想做的是创建一个类来扩展测试类。我说“有点”,因为类需要能够运行测试类能够运行的任何函数,但除非我要求,否则不能运行构造。我不想覆盖该构造。有人知道如何实现这一点吗?覆盖构造有什么错 class test { func

我有一门课:

class test {
    function __construct() {
        print 'hello';
    }
    function func_one() {
        print 'world';
    }
}

我想做的是创建一个类来扩展测试类。我说“有点”,因为类需要能够运行测试类能够运行的任何函数,但除非我要求,否则不能运行构造。我不想覆盖该构造。有人知道如何实现这一点吗?

覆盖构造有什么错

class test {
    function __construct() {
        print 'hello';
    }
    function func_one() {
        print 'world';
    }
}


class test_2 extends test {
    function __construct() {
        if (i want to) {
            parent::__construct();
        }
    }
}
class foo extends test {
   function __construct() { }
}

$bar = new foo(); // Nothing
$bar->func_one(); // prints 'world'
您可以在您的子类中定义一个根类构造函数将执行的“preConstructor”方法,并使用布尔标志来确定是否应该执行构造函数代码

像这样:

class test { protected $executeConstructor; public function __construct() { $this->executeConstructor = true; if (method_exists($this, "preConstruct")) { $this->preConstruct(); } if ($this->executeConstructor == true) { // regular constructor code } } } public function subTest extends test { public function preConstruct() { $this->executeConstructor = false; } } 课堂测试 { 受保护的$executeConstructor; 公共函数构造() { $this->executeConstructor=true; 如果(方法_存在($this,“prestruct”)) { $this->preConstruct(); } 如果($this->executeConstructor==true) { //正则构造函数代码 } } } 公共函数子测试扩展测试 { 公共函数预构造() { $this->executeConstructor=false; } }
那么不要使用构造函数。不存在“某种”扩展。@帕特里克:不清楚你想要什么样的行为。如果你陈述了你的总体目标,也许会更容易理解。我们还可以考虑一种更好的方法。至于“sort of extending”,Mixin和LyckyStiff在中为Mixin展示的一些技术将“sort of”扩展一个类,尽管(因为“sort of”的定义很差)与Patrick的意思不同。还有聚合函数()来组合类(而是将类的方法和属性添加到一个不相关的对象中)而不在PHP4中进行子类化。在PHP5中,有runkit函数()。在任何情况下,一旦实例化一个新的测试对象,就会执行构造函数。很抱歉,这可能会产生误导。@user177883:在php中,可以省略父类的构造函数(只需不在派生类的构造函数中显式调用)。我不喜欢它,但事实就是这样。Coronatus的代码在功能上是等效的,并且出错的可能性较小。但是,默认情况下,这将执行父构造函数,而他的不会。这一点更可取,由Patrick决定。@outis:OP的要求之一是“我不想重写该构造函数。”在这方面,科罗纳图斯的代码在功能上并不等同。这更像是帕特里克对短语“某种程度的扩展”的部分解释,以及他对其工作原理的想法。首先,请注意短语“不想”而不是“不能”。即使不是这样,这也是一个设计约束,而不是功能约束。问题中的模糊性使我们很难知道哪个答案更合适。只要编码人员正确地遵循您的建议,您在
预结构中添加的任何附加代码都会被放在Coronatus的
测试中n、 这两种方法将产生相同的输出,因此在功能上是等效的。我假设,如果某些代码对子类的构造函数的反射使用
ReflectionMethod::getDeclaringClass
,那么您的方法和Coronatus的方法可能会得到不同的结果,但是(因为没有证据表明OP正在使用反射,而且他使用反射的可能性很低)这是唯一的方法。对于每一个其他操作(例如,创建一个新实例,直接调用构造函数,作为回调引用构造函数,检查子类上是否存在该方法),这两种方法在功能上无法区分。