如何使用静态关键字调用非静态方法


How to call a non static method using static keyword?

我只是在检查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() 时,您正在更改继承方法的签名,从未明确声明staticparentclass

底线,您正在尝试使用一些我推荐的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