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

时间:2011-07-13 11:57:05

标签: php oop static late-static-binding

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

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

3 个答案:

答案 0 :(得分:12)

编辑: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();

如果名称相同,请使用parent PHP Manual

parent::parentFunc();

(这不完全是你要求的,只是把它放在这里是为了完整)。

Get_called_class()已针对特定情况(如late static bindings PHP Manual)推出。

请参阅Object Inheritance PHP Manual

答案 1 :(得分:0)

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

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

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

Class shape {
 ...
}

Class circle extends shape {
  function area() {

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

  }
}

如果您打算在'shape'实例(没有区域方法)上调用area方法,那么应该使用哪个子项?两种子方法都取决于形状类不常见/不实现的属性。

答案 2 :(得分: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"; }   
}
?>