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


How do I call a static child function from parent static function?

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

在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();

Edit:您尝试实现的是不可能的PHP 5.1。PHP 5.1中没有后期静态绑定PHP Manual,您需要显式地命名子类来调用子函数:Test123456::test(), self将在Test123类的静态函数中(总是)成为Test123,并且static关键字在PHP 5.1中不可用于调用静态函数。

相关:new self vs new static;PHP 5.2等效于延迟静态绑定(新静态)?


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

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

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

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

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

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

或者如果有相同的名称,使用parent PHP Manual:

parent::parentFunc();

(这不是你想要的,只是为了完整起见放在这里)。

Get_called_class()是为非常特殊的情况引入的,比如延迟静态绑定PHP Manual

参见对象继承PHP手册

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

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

然而,如果你的意思是如何调用一个在父类的子类中被重写的方法,那么这是不可能的-也不应该是这样。考虑:

Class shape {
 ...
}
Class circle extends shape {
  function area() {
  }
} 
Class square extends shape {
  function area() {
  }
}

如果你打算在'shape'的实例上调用area方法(它没有area方法),那么它应该使用哪个子方法?

这两个子方法都依赖于形状类中不常用或未实现的属性。

try this:

<?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"; }   
}
?>