我正在学习 PHP,OOP,我在静态,在这个php.net/static我不明白这句话
Calling non-static methods statically generates an E_STRICT level warning.
我确实通过上面的句子理解它仅对方法有效(不适用于属性),但实际上我没有成功理解它,我很高兴如果有什么可以告诉我解释上面句子的代码,祝你愉快星期。
我正在学习 PHP,OOP,我在静态,在这个php.net/static我不明白这句话
Calling non-static methods statically generates an E_STRICT level warning.
我确实通过上面的句子理解它仅对方法有效(不适用于属性),但实际上我没有成功理解它,我很高兴如果有什么可以告诉我解释上面句子的代码,祝你愉快星期。
这是他们对您所询问的句子的含义的示例。
考虑以下具有一种方法的类(它不是静态的)。
class Test
{
function method()
{
echo "Hello from method";
}
}
Test::method(); // attempt to statically call a non-static method
这是输出:
严格标准:非静态方法 Test::method() 不应在第 12 行的 /obj.php 中静态调用
Hello from method
如您所见,尽管它不是静态方法,但它在调用静态时确实执行了该方法,但是显示了严格的错误消息。
如果方法method()
引用了关键字$this
,那么您将遇到致命错误,因为$this
在静态方法调用的上下文中不存在。因此,虽然在技术上可以静态调用非静态类方法,但不应该这样做。
编辑:
甚至允许您静态调用非静态类成员的原因是因为在类方法的上下文中 PHP4 中不存在 static 关键字,因此如果您在 PHP4 中设计静态类或方法,则没有关键字可以指示它,您只需以静态方式调用它。现在,如果方法被静态调用但声明中没有 static 关键字,PHP5 会发出警告。
class Foo
{
public static $my_static = 'foo';
public $my_non_static = 'bar';
public function staticValue() {
return self::$my_static;
}
public function nonStaticValue() {
return self::$my_non_static;
}
}
print Foo::$my_static . "\n"; // OK
print Foo::staticValue(). "\n"; // E_STRICT
print Foo::$my_non_static . "\n"; // Fatal
print Foo::nonStaticValue(). "\n"; // Fatal
print Foo::$my_static . "\n";
没问题 - 静态访问的静态属性。
print Foo::staticValue(). "\n";
给出 E_STRICT - 静态访问的非静态方法,但不是致命错误,因为此方法不访问非静态属性。
其他两个给出致命错误,因为不能静态访问非静态字段。
这是因为即使您可以静态调用非静态方法,也不应该这样做,并且它会被记录下来。
class Foo {
function bar(){
print "you should not do that";
}
}
Foo::bar();
实际上会起作用,但您会收到E_STRICT警告,因为您可以这样做,但您不应该这样做。
如果一个方法是非静态的,则意味着它属于一个类的一个实例。例如,如果我们有一个类Car
调用了一个方法getDamage()
(它计算汽车的损坏程度),那么您不应该以静态方式调用此方法。
您应该只创建Car
该类的一个实例并调用getDamage()
该实例。这是有道理的,因为一辆特定的汽车可能会损坏 25%,而另一辆车可能会损坏 70%。
但是以静态方式调用getDamage()
是没有意义的:静态方法不属于类的特定实例,而是属于类本身。并且一个Car
类没有给出结果的有用方法getDamage()
。您仍然可以计算一个值(也许0
),但它没有意义。