Php 如何使用static关键字调用非静态方法?
我只是在检查OOPs静态/非静态概念,发现了一些奇怪的东西 我听说静态方法的输出可以通过使用带有解析运算符(:)的static关键字来获得。但在我的程序中,我使用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
<?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的概念。这与我的任何项目都无关。