2010-06-27 51 views
2

我有具有函数hi()的父类c1。类c2扩展c1,并通过方法i()包含单例访问。在类c2中,我想使用与c1中相同的名称创建方法,我可以在静态作用域中调用该方法,但在此方法中,我使用单例实例和父类中相同名称的调用方法。如何从实例范围的父类中调用具有相同名称的方法

class c1{ 
    function hi(){ 
    echo 'very '.$this->a; 
    } 
} 

class c2 extends c1{ 
    private static $i; 
    public static function i() { 
     return (self::$i)?self::$i:(self::$i = new self); 
    }  

    public $a='cool'; 
    function hi(){ 
    self::i()->hi(); // here I want to call hi() from c1 but in instance scope 
    } 
} 

c2::hi(); //must echo: very cool 

在真实的例子
C1是mysqli的
C2是我的自定义DB类
和喜()被提交()
我希望能够调用DB ::提交(),所以我不需要编写db :: i() - > commit();



编辑:PHP < 5.3

回答

2

通常调用类的父的方法的方法是使用parent::关键字,但是当你在实例范围内运行这个只作品,而不是静态的范围。

但是,您不能将hi()作为静态函数和非静态函数来运行。

class c1 
{ 
    function hi() { 
    echo 'very '.$this->a; 
    } 
} 

class c2 extends c1 
{ 
    private static $i; 

    public static function i() { 
     return (self::$i)? self::$i: (self::$i = new c2()); 
    } 

    public $a='cool'; // not static 

    function hi() { 
    parent::hi(); 
    } 

    static function do_hi() { 
    $i = self::i(); 
    $i->hi(); 
    } 
} 

c2::do_hi(); // echoes: very cool 

附加注释:奇怪的是,PHP允许你调用实例方法,就好像它们是静态的方法,使用::语法。在我看来,这是错误的,它会导致代码混淆。你应该假装这种用法是不可能的,只有当你声明它们为static时,才能静态地调用函数。

我不认为尝试聪明和强制代码做双重职责是一个很好的做法。你也不应该太喜欢复杂且难以阅读或修改的单行函数。程序员通常喜欢过于紧凑的代码,但是你会发现它使代码很难维护。项目要求不可避免地会发生变化,您最终不得不拉开您的单线宝石。

+0

我不能老是叫静态。我必须使用从方法i()获得的现有连接调用mysqli实例上的提交。 – codez 2010-06-27 08:21:06

+0

是的,我想过给不同的名字,但我想保持原来的。 – codez 2010-06-27 08:35:17

相关问题