如何从父静态函数调用子函数?
在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();
答案 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)推出。
答案 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"; }
}
?>