我学习PHP,OOP和我在静态, 在这个php.net/static我不明白这句话PHP,OOP,静态
Calling non-static methods statically generates an E_STRICT level warning.
我也知道这是由只(不属性)方法有效上面的句子, ,但我几乎没有成功地理解它实际上, 我很高兴如果有任何事情可以请给我演示解释上述句子的代码, 祝您有愉快的一周。
我学习PHP,OOP和我在静态, 在这个php.net/static我不明白这句话PHP,OOP,静态
Calling non-static methods statically generates an E_STRICT level warning.
我也知道这是由只(不属性)方法有效上面的句子, ,但我几乎没有成功地理解它实际上, 我很高兴如果有任何事情可以请给我演示解释上述句子的代码, 祝您有愉快的一周。
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 Test
{
function method()
{
echo "Hello from method";
}
}
Test::method(); // attempt to statically call a non-static method
这是输出:
严格标准:非静态方法测试::()的方法不应该是 在/obj.php静态调用上线12
你好from方法
正如你所看到的那样,它确实执行该方法时调用静态即使你这不是一个静态方法,但是显示了严格的错误信息。
如果方法method()
引用关键字$this
,那么您将遇到致命错误,因为$this
不存在于静态方法调用的上下文中。所以虽然技术上可以静态地调用非静态类方法,但不应该这样做。
编辑:
你甚至被允许调用非静态类成员静态的原因是因为static关键字没有在PHP4中的类方法的情况下存在,因此,如果你在设计一个静态类或方法在PHP4中,没有关键字来表示它,你可以简单地以静态方式调用它。现在,如果静态调用方法但在声明中没有static关键字,PHP5将发出警告。
谢谢我阅读你的解释真的很好。 – Blanktext
如果一个方法是非静态的,这意味着它属于一个类的实例。例如,如果我们有一个名为getDamage()
的方法Car
(计算汽车损坏程度),那么您不应该以静态方式调用此方法。
您应该只创建一个Car
类的实例,并在该实例上调用getDamage()
。这是有道理的,因为特定的汽车可能会损坏25%,而另一辆汽车可能会损坏70%。
但以静态方式调用getDamage()
没有意义:静态方法不属于类的特定实例,而是属于类本身。而Car
班没有有效的方法给getDamage()
的结果。你仍然可以计算一个值(可能是0
),但它没有任何意义。
谢谢你的解释很好的逻辑之一。 – Blanktext
这是因为即使您可以静态调用非静态方法,也不应该记录它。
class Foo {
function bar(){
print "you should not do that";
}
}
Foo::bar();
居然会的工作,但你会得到一个E_STRICT警告,因为你可以做到这一点,但你shouln't。
谢谢你,你的最后一行真的澄清了事情。 – Blanktext
它告诉你,如果你调用一个非静态方法而没有初始化它,我会给出一个E_STRICT警告。你不明白什么?静态意味着您可以调用该方法而无需将类初始化为对象。 –
你应该了解的OOP和静态调用最重要的是他们不混合。静态调用是程序编程思维的一部分。 –
谢谢大家,我正在阅读他们的答案。 – Blanktext