我只是在检查OOPs静态/非静态概念,发现了一些奇怪的东西。
我听说静态方法的输出可以通过使用带有分辨率运算符(::)的静态关键字来获取。但是在我的程序中,我使用静态关键字获取非静态方法的值。任何人都可以解释该程序吗?我越来越困惑了。
<?php
error_reporting(E_ALL);
class parentclass
{
protected function sum()
{
return 145;
}
}
class childclass extends parentclass
{
protected function sum()
{
return 125;
}
}
class grandchild extends childclass
{
function sum()
{
return 100;
}
function __construct()
{
echo static::sum(); // 100 as output but how
}
}
$obj = new grandchild();
?>
除此之外,如果我使子类的函数 sum() 像静态一样
class childclass extends parentclass
{
protected static function sum()
{
return 125;
}
}
那么它也给出了致命错误,如下所示:
致命错误:无法使非静态方法父类::sum() 在类子类中静态
但是为什么我不调用该函数。
你可以静态调用一个函数,即使它没有声明为 static
,只要你不在其中引用$this
。
这就是原始代码工作的原因。
但是,不能更改继承方法的签名。
致命错误:无法使非静态方法父类::sum() 静态 课堂上儿童班
当您在 childclass
中声明 protected static function sum()
时,您正在更改继承方法的签名,从未明确声明static
的 parentclass
。
底线,您正在尝试使用一些我推荐的PHP怪癖。是的,它们有效,但这并不意味着您应该使用它们。
坚持严格的编码风格。为静态和实例使用编写单独的方法,并按预期调用它们。
您正在使用static
作为后期静态绑定。但你听到的是相当
class Foo
{
static function bar() {}
}
$baz = Foo::bar();
我认为
为了更好地理解后期静态绑定,您可以编写代码的变体:
<?php
error_reporting(E_ALL);
class parentclass
{
protected function sum()
{
return 145;
}
public function do_the_math()
{
printf('Static sum: %d, Self sum: %d',
static::sum(),
self::sum());
}
}
class childclass extends parentclass
{
protected function sum()
{
return 125;
}
}
class grandchild extends childclass
{
function sum()
{
return 100;
}
}
$obj = new grandchild();
$obj->do_the_math();
输出:
Static sum: 100, Self sum: 145