【问题标题】:error :should not be called statically, assuming $this from incompatible context. only on my machine错误:不应静态调用,假设 $this 来自不兼容的上下文。只在我的机器上
【发布时间】:2014-11-08 21:03:09
【问题描述】:

我的团队成员在控制器中静态编写了模型函数调用如:

$data = ModelName::functionName($param);

虽然它应该被动态调用,例如:

$model = new Model();
$data = $model->functionName($param);

几乎所有的调用都是静态进行的。该代码在服务器和他们的本地机器上运行,除了我的。而且静态调用太多了,如果不重写庞大的代码库就无法修复。

我总是通过 composer 更新我的项目。我的php版本是5.4。

有人可能知道这是关于什么的吗?

【问题讨论】:

  • 请提供一个例子。另外,PHP 5.5 已经发布很久了,甚至 5.6 都已经发布了,所以你应该考虑最终更新到最新版本。
  • 我更新了我的 php 版本,这似乎解决了问题,谢谢。 @UlrichEckhardt

标签: php static-methods


【解决方案1】:

您可能在运行 PHP 时带有 E_STRICT 错误报告。尝试将其关闭,看看是否能解决问题——比如为E_STRICT 错误报告错误。 See this post on SO

<?php
error_reporting(E_ALL ^ E_STRICT);

但我不得不说,混合使用对象样式和静态样式调用是个坏主意。函数调用应该明确地表明一个函数是在静态或对象上下文中调用的,并相应地采取行动。即使有点难(对所有文件进行 grep 并更改错误的调用有多难?),我建议先修复您的代码。

我还推荐阅读面向对象编程中的static keyword - 区分静态和对象方法调用是有原因的,而不是“让事情变得更简单”的原因,但更像是一个 “让事情更清晰”,我会说。

【讨论】:

  • 我同意,你只是在隐藏问题。你真的应该把它改成正确的方式。
  • 即使您关闭错误报告,这些警告也会影响性能:请参阅:stackoverflow.com/questions/1868874/…
  • @AdamFriedman 我想你的意思是:编写糟糕的代码会影响性能? ;) 感谢您的有用帖子,不知道。
  • 我个人喜欢静态函数,因为它们调用方式简单,无需初始化。而且因为有些方法并不真正需要不同的“对象”实例,所以它们看起来很适合 API 方法。因此,当它们充当“通用/全局/功能”函数时,我认为它们没有任何问题。
【解决方案2】:

对不起,我的英文写得不太好,但我理解你的问题是:

你需要把你的静态函数:

static public function functionName () {

   $data = ModelName :: functionName ($ param);

}

这通过服务器处理的不同版本的PHP 发生。 我希望我已经理解了您的问题并很好地翻译了它,因为我出现了类似的错误,我就这样解决了。

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多