【问题标题】:Call base Class function调用基类函数
【发布时间】:2013-05-09 09:58:08
【问题描述】:

说我有:

文件 BaseFoo.php :

require('MyClass1.php')
class BaseFoo(){

  function check(){
     //do somme stuff
  }

  function f1($o){
     $c = new MyClass1();
     return $c->f1($o);
  } 

}

文件 MyClass1.php :

MyClass1(){
   function f1(){
       ???->check() // how to call check() (in initiator BaseFoo class) ?
       // do other stuff
   }
}

现在的问题是:在 MyClass1 的函数 f1 中,我想调用启动器类中的 check() 函数。

感谢您的帮助!

【问题讨论】:

  • 你可以让函数检查'静态'所以你可以调用 BaseFoo::check()
  • 是的,我认为这是最好的解决方案,我问自己是否可以使用类似 parent 的东西(但不能使用 parent,因为没有扩展)
  • 我将我的帖子添加到新答案

标签: php class function object call


【解决方案1】:

因为BaseFoo 没有扩展MyClass1,所以它不被称为基类。这意味着您确实不能使用parent您需要有一个可以调用该方法的对象。 根据您的需要,您可能需要在 MyClass1(本地或作为成员)中创建类 BaseFoo 的对象(或传递一个对象),或者您可以将 BaseFoo::check() 设为静态:

class BaseFoo(){

  static function check(){
     // Note: you can only access static members here
     // Calling non-static methods statically generates an E_STRICT level warning. 
  }

  function f1($o){
     $c = new MyClass1();
     return $c->f1($o);
  } 

}

但是,这很可能不是您真正想要做的。你应该问“谁拥有什么?”这个问题。在这里,BaseFoo 拥有 MyClass1 对象。所以你可能想要这个:

class BaseFoo(){

  function check(){
     //do somme stuff
  }

  function f1($o){
     $c = new MyClass1();
     check();
     return $c->f1($o);
  } 

}

还有:

MyClass1(){
   function f1(){
       // Don't check here, the creator should check
       // do other stuff
   }
}

您可能需要检查 MyClass1BaseFoo 中的不同内容,并且您将有 2 个单独的 check 方法。

【讨论】:

    【解决方案2】:

    如果你用谷歌搜索,你会找到答案,但是Check this page

    所以你可以使用类似的东西:

    class BaseFoo(){
    
      public static function check(){
         //do somme stuff
      }
    
      function f1($o){
         $c = new MyClass1();
         return $c->f1($o);
      } 
    
    }
    
    class MyClass1(){
       function f1(){
           BaseFoo::check() // call static function check from BaseFoo
           // do other stuff
       }
    }
    

    【讨论】:

    【解决方案3】:

    你可以做功能检查'static'所以你可以打电话给BaseFoo::check()

    【讨论】:

    • 对,没有别的办法吗?因为 BaseClass 名称是由定义定义的 ('SERVICE_NAME','BaseFoo');所以 SERVICE_NAME::check() 工作了吗?
    • 你可以使用 call_user_func stackoverflow.com/questions/2108795/…
    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 2016-09-23
    • 2010-09-28
    • 2011-02-12
    • 2011-06-19
    • 2011-06-17
    • 2023-01-04
    相关资源
    最近更新 更多