2012-05-24 59 views
4

我学习PHP,OOP和我在静态, 在这个php.net/static我不明白这句话PHP,OOP,静态

Calling non-static methods statically generates an E_STRICT level warning. 

我也知道这是由只(不属性)方法有效上面的句子, ,但我几乎没有成功地理解它实际上, 我很高兴如果有任何事情可以请给我演示解释上述句子的代码, 祝您有愉快的一周。

+1

它告诉你,如果你调用一个非静态方法而没有初始化它,我会给出一个E_STRICT警告。你不明白什么?静态意味着您可以调用该方法而无需将类初始化为对象。 –

+1

你应该了解的OOP和静态调用最重要的是他们不混合。静态调用是程序编程思维的一部分。 –

+0

谢谢大家,我正在阅读他们的答案。 – Blanktext

回答

4
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 - 静态访问非静态方法,但不是致命错误,因为此方法不访问非静态属性。

另外两个给出致命错误,因为无法静态访问非静态字段。

+0

当你说非静态字段时,意思是该值没有被定义为静态字段内的静态值?而关于E_STRICT它不仅仅是因为它的访问非静态的特性,我可以返回简单的字符串,我不必自己:$ x_static_prop。 – Blanktext

+0

当我说非静态字段时,我的意思是属性,没有静态关键字定义。对不起,我不明白你的第二句话。 – Ruben

+0

谢谢Ruben,我现在明白你的意思了,关于我的第二句话,我的意思是说我可以做'Hellow';而不是self :: $ static_prop。 – Blanktext

4

下面是他们对您提问的句子的含义的示例。

用一种方法考虑以下类(它不是静态的)。

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将发出警告。

+0

谢谢我阅读你的解释真的很好。 – Blanktext

0

如果一个方法是非静态的,这意味着它属于一个类的实例。例如,如果我们有一个名为getDamage()的方法Car(计算汽车损坏程度),那么您不应该以静态方式调用此方法。

您应该只创建一个Car类的实例,并在该实例上调用getDamage()。这是有道理的,因为特定的汽车可能会损坏25%,而另一辆汽车可能会损坏70%。

但以静态方式调用getDamage()没有意义:静态方法不属于类的特定实例,而是属于类本身。而Car班没有有效的方法给getDamage()的结果。你仍然可以计算一个值(可能是0),但它没有任何意义。

+0

谢谢你的解释很好的逻辑之一。 – Blanktext

2

这是因为即使您可以静态调用非静态方法,也不应该记录它。

class Foo { 
    function bar(){ 
     print "you should not do that"; 
    } 
} 

Foo::bar();居然会的工作,但你会得到一个E_STRICT警告,因为你可以做到这一点,但你shouln't

+0

谢谢你,你的最后一行真的澄清了事情。 – Blanktext