12

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

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

3 回答 3

23

编辑: PHP 5.1 无法实现您尝试实现的目标。PHP 5.1中没有后期静态绑定PHP 手册,需要显式命名子类才能调用子函数:Test123456::test()selfTest123在类的静态函数中Test123(always)且static关键字不可用调用静态函数在 PHP 5.1 中。

相关:新自我与新静态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_call_class() 已针对非常特殊的情况引入,例如后期静态绑定PHP 手册

请参阅对象继承PHP 手册

于 2011-07-13T12:03:21.833 回答
0

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

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

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

Class shape {
 ...
}

Class circle extends shape {
  function area() {

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

  }
}

如果您打算在“shape”实例(没有 area 方法)上调用 area 方法,那么它应该使用哪个子节点?这两种子方法都将取决于形状类不常见/未实现的属性。

于 2011-07-13T12:07:56.637 回答
0

试试这个:

<?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"; }   
}
?>
于 2011-07-13T12:48:33.603 回答