如何从父静态函数调用静态子函数?

Posted

技术标签:

【中文标题】如何从父静态函数调用静态子函数?【英文标题】:How do I call a static child function from parent static function? 【发布时间】:2011-10-04 10:36:24 【问题描述】:

如何从父静态函数调用子函数?

php5.3 中有一个名为get_called_class() 的内置方法可以从父类调用子方法。但是我的服务器运行的是 php 5.1

有什么办法可以做到吗?

我想从静态函数中调用它。这样我就不能使用“$this”

所以我应该使用“self”关键字。

下面的例子我的父类是“Test123”,从父类静态函数“myfunc”试图调用像这样的子类函数“self::test();”

abstract class Test123


  function __construct()
  
    // some code here
  

  public static function myfunc()
  
    self::test();
  

  abstract function test();


class Test123456 extends Test123

  function __construct()
  
    parent::__construct();
  

  function test()
  
    echo "So you managed to call me !!";
  



$fish = new Test123456();
$fish->test();
$fish->myfunc();

【问题讨论】:

您应该向我们展示您的代码的 sn-p 只需使用$this->parentFunc()。不,没有引入 get_call_class() 来调用父函数。 -- php.net/manual/en/language.oop5.inheritance.php PHP: How to call function of a child class from parent class的可能重复 我的父函数是static @Sahal:PHP 5.1 中没有后期静态绑定,需要显式命名类才能调用函数:Test123456::test()self 将是 Test123。 - 请参阅我更新的答案以获得解释。 【参考方案1】:

编辑: PHP 5.1 无法实现您尝试实现的目标。 PHP 5.1 中没有late static bindings PHP Manual,您需要显式命名子类来调用子函数:Test123456::test()self 在类Test123 的静态函数中将是Test123(总是)和static 关键字在 PHP 5.1 中不能用于调用静态函数。

相关:new self vs new static; PHP 5.2 Equivalent to Late Static Binding (new static)?


如果您指的是静态父函数,那么您需要在 php 5.1 中为函数调用显式命名父(或子):

parentClass::func();
Test123456::test();

在 PHP 5.3 中,您可以使用 static 关键字 PHP Manual 来解析被调用类的名称:

static::func();
static::test();

如果这些不是静态的,只需使用 $this PHP Manual:

$this->parentFunc();
$this->childFunc();

或者如果同名,使用parentPHP Manual

parent::parentFunc();

(这不是您所要求的,只是为了完整起见将其放在这里)。

Get_call_class() 已针对非常具体的情况引入,例如 late static bindings PHP Manual

见Object Inheritance PHP Manual

【讨论】:

OT:您如何如此一致地创建文档链接?我已经在几个用户身上看到过这种情况,您是否为此使用了某种脚本?【参考方案2】:

我怀疑你对父/子、类/对象和函数/方法有点困惑。

Ionuț G. Stan 解释了如何调用未在父类中声明的方法(正如他所说,父类应该是抽象的或实现 __call() 方法)。

但是,如果您的意思是如何从父类调用已在子类中覆盖的方法,那么这是不可能的 - 也不应该是。考虑:

Class shape 
 ...


Class circle extends shape 
  function area() 

  
 
Class square extends shape 
  function area() 

  

如果您打算在“shape”实例(没有 area 方法)上调用 area 方法,那么应该使用哪个子对象?两个子方法都将依赖于不常见/未由 shape 类实现的属性。

【讨论】:

【参考方案3】:

试试这个:

<?php
 class A 
 public static function newInstance() 
$rv = new static();  
return $rv;


public function __construct()  echo " A::__construct\n"; 

class B extends A 
public function __construct()  echo " B::__construct\n"; 
 
class C extends B 
public function __construct()  echo " C::__construct\n";    

?>

【讨论】:

以上是关于如何从父静态函数调用静态子函数?的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS中从父组件调用子函数时如何在子组件中设置状态

角 6 |如何从父组件调用子组件中的函数?

MFC中多线程中静态函数调用成员函数的问题

python成员函数如何调用静态函数

reactjs中未从父级调用子组件函数

markdown Angular - 从父级调用子组件函数