PHP Strict standards:Declaration of … should be compatible with that of…(转)

今天把原来一份很老的PHP代码导入到了PaaS上,出现了许多Strict standards:Declaration of … should be compatible with that of…这样的错误,字面意思好像是说函数不匹配,看了下出错的函数,都是子类重写的基类函数。 上网搜索了一下,发现许多帖子基本都抄的一样,说什么这是由于 php5.3版本后,要求继承类必须在父类之后定义,如果父类定义在前,继承类在后,就不会出现这个错误。尤其是http://bugs.php.net/bug.php?id=46851上面还煞有介事的给出了正反例:


1

2

3

4

5

6

7

8

9

<?php

// this code does trigger a strict message

error_reporting( E_ALL | E_STRICT );

class cc extends c { function test() { return null; } }

class c { function test( $a ) { return 1; } }

$cc = new cc();

?>


1

2

3

4

5

6

7

8

9

<?php

// this code does NOT trigger a strict message

error_reporting( E_ALL | E_STRICT );

class c { function test( $a ) { return 1; } }

class cc extends c { function test() { return null; } }

$cc = new cc();

?>

并且讨论了出错的情况多半是由于用_autoload()对类进行自动的include,导致基类的定义在后面,子类定义在前面。

我看了下自己的代码,虽然确实也用到了autoload,但是都是显式的先导入了几个基类,并不存在这样的情况,而且将上面的正反例子试了一下,都会出现E_STRICT的警告。

真正原因:

其实如果子类重写方法的参数和基类不一样,只要给参数个默认值,使得编译器认为参数可以为空,保持重写方法与基类方法的函数签名相同就可以了。

经常用JAVA的同学肯定知道,在JAVA或者C++中,重写方法的函数签名本应该就和基类函数是一致的,我认为这也是符合自然规律的,因为override本来就是覆盖的意思嘛,既然覆盖了,那么就应该和原函数一致,不然怎么能“盖”的住呢~并且方法的重写多用在重写虚函数或者更明白的说就是重写接口的函数,如果重写的时候函数签名都不一致了,还要接口干嘛呢。。。

所以PHP的新版本中,我觉得定义这个E_STRICT的警告错误是很有用处的,要提醒程序员自己的重写方法到底对不对。

最后还是鄙视一下上面那些抄来抄去的帖子,如果某个语言连基类和子类定义的顺序都不能打乱,说明这个编译器非常有问题了,显然是bug。。。

时间: 2024-12-28 10:43:52

PHP Strict standards:Declaration of … should be compatible with that of…(转)的相关文章

php 错误 Strict Standards: PHP Strict Standards: Declaration of .... should be compatible with that of 解决办法

错误原因:这是由于 php 5.3版本后.要求继承类必须在父类之后定义.否则就会出现Strict Standards: PHP Strict Standards: Declaration of .... should be compatible with that of .... 的错误提示.也就是说必须父类在前,继承类在后.错误参考页面.bugs点php点net/bug.php?id=46851  (不能发表带链接的网址) 上面清楚地解释了出现此类错误的具体原因.解决办法:在wordpress

‘‘Strict Standards: Declaration of‘‘ php错误

最近装系统php5.5.16的版本出现问题: 在config.php上加上: error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

PHP Strict Standards:问题解决

Strict standards: Declaration of ... should be compatible with that of ... 意思就是子类(IndexAction)重写的show方法与父类(Action)中的show方法不兼容,php方法重写要求是要参数个数.方法名称与父类要一致 PHP Strict Standards:问题解决

安装ECMall后报PHP Strict Standards错误,请问如何解决

Strict Standards: Non-static method ECMall::startup() should not be called statically in /htdocs/ecmall/index.php on line 22 Deprecated: Assigning the return value of new by reference is deprecated in /htdocs/ecmall/eccore/controller/app.base.php on

ECSHOP安装或使用中提示Strict Standards: Non-static method cls_image:

随着ECSHOP的不断发展,越来越多的人成为了ECSHOP的忠实粉丝.由于每个人的服务器环境和配置都不完全相同,所以ECSHOP也接二连三的爆出了各种各样的错误信息.相信不少新手朋友在ECSHOP安装过程中都碰到过类似下面这样的错误提示吧.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /....../install/includes/lib_instal

ECshop Strict Standards: Only variables should be passed by reference in解决办法

本文章来给各位同学介绍关于ECshop Strict Standards: Only variables should be passed by reference in解决办法,希望此教程 对各位同学有所帮助. 错误提示 Strict Standards: Only variables should be passed by reference in D:/wamp/ecshop/includes/cls_template.php on line 406 用软件打开406行是这句话$tag_s

ECShop出现Strict Standards: Only variables should be passed by reference in的解决方法

今天安装ecshop的时候最上面出现了一个错误提示:Strict Standards: Only variables should be passed by reference in F:\www.xxxx.com\cls_template.php on line 418 解决办法: 打开cls_template.php文件中发现下面这段代码: $tag_sel = array_shift(explode(' ', $tag));忘记说了,我的PHP版本是5.4.19,PHP5.3以上默认只能传

已解决:Strict Standards: Only variables should be passed by reference in

今天安装ecshop的时候最上面出现了一个错误提示:Strict Standards: Only variables should be passed by reference in F:\www.xxxx.com\cls_template.php on line 418 解决办法: 打开cls_template.php文件中发现下面这段代码: $tag_sel = array_shift(explode(' ', $tag));忘记说了,我的PHP版本是5.4.19,PHP5.3以上默认只能传

php报警:Strict Standards: Only variables should be passed by reference in

错误原因 因为end函数的原因. end函数: mixed end    ( array &$array   ) 你可以看到end的参数是一个引用(reference),而你只能把一个变量的引用作为一个参数传给函数,而你直接把explode('.',$name)作为参数传给end函数,所以才有这个提示. 你可以这样修改,先定义一个变量,然后把这个变量传给end函数 解决方案: 打开includes/lib_main.php 把代码一 改成 代码二 即可解决错误. 代码一 1 function g