如何消除php5严格标准错误?

26
升级PHP到5.4.3后(WAMP服务器2.2),我使用CakePHP 1.3制作的Web应用程序在我的索引中显示以下错误:
严格标准:在C:...\ cake \ cake \ libs \ object.php的第63行中为类Object重新定义已经定义的构造函数
严格标准:不应该在C:...\ cake \ cake \ bootstrap.php的第49行静态地调用非静态方法Configure :: getInstance()
我发现有些人通过将php.ini中的error_reporting设置为E_ALL&〜E_STRICT来解决此问题。
我在计算机上的两个php.ini文件(C:\ wamp \ bin \ php \ php5.4.3和C:\ wamp \ bin \ apache \ apache2.4.2 \ bin)中都进行了设置,但未解决问题。
我还尝试在C:... \ cake.htaccess中添加php_value error_reporting 6143,但没有成功。
有人知道怎么解决吗?由于火鸟,我无法升级我的CakePHP。

1
你也重启了Apache吗?通常情况下,对于WAMP,你可以通过点击图标并选择PHP=>php.ini来导航到正确的php.ini文件。 - mark
1
你是否执行了 <?php phpinfo(); ?> 来查看你修改的是正确的 php.ini 文件? - Mihai Iorga
在我的情况下,解决这些问题的方法是升级CakePHP,但由于CakePHP 2.x不支持firebird,我无法这样做。我已经打印了phpinfo()并显示我的php.ini文件位于C:\ wamp \ bin \ apache \ apache2.4.2 \ bin。我已经重新启动了apache。不,wamp菜单中打开的php.ini文件不正确。 - qxlab
在Win10上,仅用于开发目的,在IIS上运行PHP 7。修改php.ini文件对我有帮助。error_reporting = E_ALL&〜E_STRICT&〜E_DEPRECATED - Nick
7个回答

23

php 5.4的一个改变是E_STRICT现在包含在E_ALL中。

因此,在你的/cake/bootstrap.php文件中,你可以将E_STRICT从错误报告中移除:

error_reporting(E_ALL ^ E_STRICT);

并且再次与5.4版本之前兼容。


6
谢谢!我在C:...\cake\cake\bootstrap.php文件中添加了"error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED);"并解决了问题。 - qxlab
1
使用了这个代码 error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED); 后,我的视图出现了问题... 有什么帮助吗? - MuntingInsekto
我在bootstrap.php中应用了同样的东西,但是Strict Standard没有改变。 - Amit Jha
这是因为它被你的 core.php 文件 (Configure::write('Error'...)) 覆盖了。请参见下面的答案。 - Claudio Bredfeldt

14

如果你想更新Cake版本,修改蛋糕核心文件是很麻烦的。相反,打开Config/core.php文件,寻找错误处理程序配置:

Configure::write('Error', array(
    'handler' => 'ErrorHandler::handleError',
    'level' => E_ALL & ~E_DEPRECATED,
    'trace' => true
));

并将“level”替换为此:

...
'level' => E_ALL & ~E_STRICT & ~E_DEPRECATED,
...

1
这是最好的选择 - 我在 bootstrap.php 中的 error_reporting 已经被这些设置覆盖了。 - jocull
对于CakePHP的用户来说,这是正确的解决方案。更改PHP.INI文件没有任何效果,因为它在这里被覆盖了。 - UncaAlby

9

请替换

error_reporting = E_ALL 

在你的php.ini文件中,使用以下代码:

error_reporting = E_ALL & ~E_STRICT

对于我来说

error_reporting(E_ALL ^ E_STRICT);

这个问题的接受答案中所展示的方法在我的Joomla网站上无法工作,并出现了JError中检测到无限循环的错误。


正如我在正确答案的评论中所述,为了解决我的问题,我使用了 error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED);,现在我不记得为什么这样做了。 - qxlab

4

您正在使用较新的PHP版本。在PHP 5.4中,E_STRICT是E_ALL的一部分。

在Cake 1.3中,打开文件/cake/bootstrap.php并将error_reporting更改为以下内容:

error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED);

1
如果你在cake控制台输出中遇到PHP严格警告,请查看你的app/config/core.php
在CakePhp 1.3中,error_reporting(...)'log'选项覆盖,因此请确保在此处排除E_STRICT
/**
 * CakePHP Log Level:
 *
 * In case of Production Mode CakePHP gives you the possibility to continue logging errors.
 *
 * The following parameters can be used:
 *  Boolean: Set true/false to activate/deactivate logging
 *    Configure::write('log', true);
 *
 *  Integer: Use built-in PHP constants to set the error level (see error_reporting)
 *    Configure::write('log', E_ERROR | E_WARNING);
 *    Configure::write('log', E_ALL ^ E_NOTICE);
 */
Configure::write('log', E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);

0

确保您已更新正确的php.ini文件 - 如果在根目录中创建一个带有以下代码的php文件

<?php

phpinfo();

?>

如果在您的Web浏览器中加载它,它将告诉您正在使用哪个ini文件,以防您错过了其中一个。

还有可能是htaccess文件通过php_flag error_reporting值设置该值,该值也可以针对每个目录进行设置。


谢谢您的回答,phpinfo()显示我正在更改正确的php.ini文件。我不明白您关于htaccess的评论...我应该尝试些什么? - qxlab

0

从文件夹 (根目录) cake 返回 bootstrap.php 文件

if (!defined('E_ALL')) {
    define('E_ALL', 8192);
}

从文件夹(root)cake\libs返回debugger.php文件

error_reporting(E_ALL ^ ~E_STRICT ^ ~E_DEPRECATED);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接