在我公司的代码库中,我看到静态和对象上下文中使用的函数。对于例如类A具有函数b(),其使用A :: b()和/或object_of_type_A-> b()来调用。我知道如果打开strict,会抛出错误。但我想知道这是不是一种不好的做法,如果是的话,为什么呢?谢谢你的回答。
如果我在任何地方都没有意义,请告诉我。我很乐意澄清。
答案 0 :(得分:7)
我不是一个骗子的人,但这听起来就像Java一样,允许但不鼓励。
如果它是静态的,我会强烈建议只以静态方式调用它。否则它看起来就像它取决于你应该调用它的对象的状态。
在Java中,最好的例子是Thread.sleep()
。这是一个静态方法,它始终将当前线程置于休眠状态。但看看这段代码:
Thread t = new Thread(someTask);
t.start();
t.sleep(1000);
该代码正在做什么看起来?它似乎是将其他线程置于休眠状态,而实际上它将是正在休眠的当前线程。当您将其更改为普通静态调用时,更明显:
Thread.sleep(1000);
这不是指t
,因此必须与当前主题有关。
除非有一些特定的PHP,通过变量调用静态方法给你一些多态性,我建议你坚持以静态方式调用它。严格模式告诉你这样做的事实是一个非常强烈的提示,IMO:)
答案 1 :(得分:2)
这是一些测试代码:
<?php
error_reporting(E_ALL | E_STRICT);
class Foo{
public function a(){
}
public static function b(){
}
}
$MyFoo = new Foo;
Foo::a(); // Strict Standards: Non-static method Foo::a() should not be called statically
Foo::b();
$MyFoo->a();
$MyFoo->b(); // No complaints
?>
PHP / 5.3警告静态调用非静态方法,这很好,因为一旦你想访问$this
它们就会失败。但它没有抱怨对静态函数的对象上下文调用:没有什么可以出错。 This behaviour is documented:
声明类属性或方法 因为静态使它们可以访问 无需实例化 班级。声明为的财产 静态无法访问 实例化的类对象(尽管是 静态方法可以) [...] 因为静态方法是可调用的 没有对象的实例 创建,伪变量$ this 方法内部不可用 声明为静态。
因此,就PHP而言,您在代码库中找到的内容并没有错。但是,我认为这有点令人困惑。
答案 2 :(得分:1)
当前使用它时没有任何害处,除非当然作为静态函数调用时,您无法访问$ this成员。
严格错误的原因是因为不按严格标准编写代码会导致由于缺乏勤奋而导致错误。在将来它也可能导致您的代码中断。静态函数没有$ this成员,它可能会破坏参数传递。
安全地播放只调用带有A :: b()类型调用的静态函数。
DC
答案 3 :(得分:1)
关于在静态函数中访问$ this,我发现一段时间后有点奇怪(虽然可能会在PHP的更高版本中更改,但我认为我运行了5.2或者其他东西)。
你可以在这里阅读它,但它是瑞典语。但是使用谷歌翻译,它应该是可以理解的。