如何从实例范围中的父类调用具有相同名称的方法

时间:2010-06-27 07:48:56

标签: php oop

我有父类c1,函数为hi()。 class 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类
和hi()是commit()
我希望能够调用db :: commit(),所以我不需要编写db :: i() - > commit();



编辑:PHP< 5.3

2 个答案:

答案 0 :(得分: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时静态调用函数。

我认为试图聪明并强制执行双重任务代码是一种很好的做法。此外,您不应该太喜欢复杂且难以阅读或修改的单行函数。程序员通常喜欢过于紧凑的代码,但你会发现它使代码很难维护。项目要求不可避免地会发生变化,无论如何你最终都不得不拆开你的单线宝石。

答案 1 :(得分:2)

你可以静态呼叫mysqli_commit

parent::commit();