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

Php 如何使用static关键字调用非静态方法?,php,oop,php-5.5,Php,Oop,Php 5.5,我只是在检查OOPs静态/非静态概念,发现了一些奇怪的东西 我听说静态方法的输出可以通过使用带有解析运算符(:)的static关键字来获得。但在我的程序中,我使用static关键字获取非静态方法的值。有人能解释一下这个节目吗?我弄糊涂了 <?php error_reporting(E_ALL); class parentclass { protected function sum() { return 145; } } class childcl

我只是在检查OOPs静态/非静态概念,发现了一些奇怪的东西

我听说静态方法的输出可以通过使用带有解析运算符(:)的static关键字来获得。但在我的程序中,我使用static关键字获取非静态方法的值。有人能解释一下这个节目吗?我弄糊涂了

<?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(); 
?>
然后,它还会给出如下致命错误:

致命错误:无法在类childclass中将非静态方法parentclass::sum()设为静态


但是为什么我不调用该函数。

您使用的是
静态
。但你所听到的是

class Foo
{
  static function bar() {}
}

$baz = Foo::bar();

您使用的是
静态
。但你所听到的是

class Foo
{
  static function bar() {}
}

$baz = Foo::bar();

您可以静态调用函数,即使该函数未声明为
静态
,只要不在其内部引用
$this

这就是原始代码工作的原因

但是,您不能更改继承方法的签名

致命错误:无法将非静态方法parentclass::sum()设为静态 课堂上的孩子们

当您在
childclass
中声明
protected static function sum()
时,您正在更改从
parentclass
继承的方法的签名,该方法未专门声明
static

总之,您正在尝试使用一些我建议您不要使用的PHP怪癖。是的,它们有效,但这并不意味着你应该使用它们


坚持严格的编码风格。为静态和实例使用编写单独的方法,并按预期调用它们。

您可以静态调用函数,即使它未声明为
静态
,只要不在其中引用
$this

这就是原始代码工作的原因

但是,您不能更改继承方法的签名

致命错误:无法将非静态方法parentclass::sum()设为静态 课堂上的孩子们

当您在
childclass
中声明
protected static function sum()
时,您正在更改从
parentclass
继承的方法的签名,该方法未专门声明
static

总之,您正在尝试使用一些我建议您不要使用的PHP怪癖。是的,它们有效,但这并不意味着你应该使用它们


坚持严格的编码风格。为静态和实例使用编写单独的方法,并按预期调用它们。

我认为要更好地理解后期静态绑定,您可以编写代码的变体:

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

我认为,为了更好地理解后期静态绑定,可以编写代码的变体:

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

在这里运行:显示100…是的,实际上我现在已经编辑了函数名。现在是sum(),如果您不能绝对确定静态何时有用,请尽量避免使用它们。在你的例子中,使用static是没有意义的。我只是想了解一下为什么它将输出设为100。我的意思是sum()是非静态的,我使用static::resolution操作符调用它。如果你知道原因,那么请让我知道@danfromGermany在这里运行它:show 100…是的,实际上我现在已经编辑了函数名。现在是sum(),如果您不能绝对确定静态何时有用,请尽量避免使用它们。在你的例子中,使用static是没有意义的。我只是想了解一下为什么它将输出设为100。我的意思是sum()是非静态的,我使用static::resolution操作符调用它。如果你知道原因,请让我知道@DanFromGermany是的,只需点击链接并阅读相关文章。然后,您可能会了解
self
static
是如何工作的,甚至可能了解它们的不同之处。是的,亲爱的,我知道self和static关键字之间的区别,我知道后期静态绑定的概念。static关键字用于后期静态绑定,但这里有不同的概念。无论是在类外部调用静态方法还是在类内部调用静态方法,都会有所不同。是的,只需按照链接阅读相关文章即可。然后,您可能会了解
self
static
是如何工作的,甚至可能了解它们的不同之处。是的,亲爱的,我知道self和static关键字之间的区别,我知道后期静态绑定的概念。static关键字用于后期静态绑定,但这里是不同的概念。无论是在类外部还是在类内部调用静态方法,都会产生不同。我只是检查oops概念。这与我的任何项目都没有关系。我只是在检查oops的概念。这与我的任何项目都无关。