2010-04-02 94 views
3

我有一个类:php扩展,但有一个新的构造函数...可能吗?

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

什么,我想这样做是有那种扩展测试类的类。我说'排序',因为类需要能够运行测试类能够运行的任何函数,但是除非我问它,否则不要运行构造。我不想重写构造。任何人有任何想法如何实现这一目标?

+0

不使用构造函数即可。没有什么“扩展”。 – DarthVader 2010-04-02 03:53:29

+0

@ user177883是的。 – 2010-04-02 04:59:47

+0

@帕特里克:目前尚不清楚你想要什么样的行为。也许如果你说明了你的总体目标,这将更容易理解。我们也可能会想到一个更好的方法。 – outis 2010-04-02 18:12:46

回答

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


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

在任何情况下,一旦你实例化一个新的测试对象,构造函数将被执行。对不起,但这可能是误导。 – DarthVader 2010-04-02 03:55:05

+2

@ user177883:在php中,您可以省略父类的构造函数(仅仅通过在派生类的构造函数中不显式调用它)。我不喜欢它,但是就是这样。 – VolkerK 2010-04-02 04:12:05

1

重写构造有什么问题?

class foo extends test { 
    function __construct() { } 
} 

$bar = new foo(); // Nothing 
$bar->func_one(); // prints 'world' 
0

你可以定义你的子类是“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; 
    } 
} 
+0

Coronatus的代码在功能上是等同的,错误的可能性较小。但是,这将默认执行父构造函数,而他不会。帕特里克最好选择哪一个。 – outis 2010-04-02 18:22:54

+0

@outis:OP的要求之一是“我不想重写构造。”在这方面,Coronatus的代码在功能上并不相同。 – Adrian 2010-04-02 22:58:25

+0

,它更像帕特里克对“延伸的种类”一词的解释的一部分,以及他关于它如何工作的想法。首先,注意措辞“不想”而不是“不能”。即使情况并非如此,这是一个设计约束,而不是一个功能约束。问题中的含糊不清使得很难知道哪个答案更合适。 – outis 2010-04-03 00:15:55

相关问题