【问题标题】:How to call method with the same name from parent class in instance scope如何在实例范围内从父类调用同名方法
【发布时间】:2010-06-27 07:48:55
【问题描述】:

我的父类 c1 具有函数 hi()。类 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 是我的自定义数据库类
并且 hi() 是 commit()
我希望能够调用db::commit(),所以我不需要写db::i()->commit();



编辑:PHP

【问题讨论】:

    标签: php oop


    【解决方案1】:

    通常调用类的父方法的方法是使用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时才静态调用函数。

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

    【讨论】:

    • 我不能静态调用。我必须使用从方法 i() 获得的现有连接调用 mysqli 实例上的提交。
    • 是的,我想过给不同的名字,但我想保持原来的。
    【解决方案2】:

    你可以静态调用mysqli_commit

    parent::commit();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2014-03-12
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多