<?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();
?>
< ?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的警告。

再看例子

代码如下  
<?php
abstract class A {
// 方法无参数
public static function foo(){ echo 'bar'; }
}

abstract class B extends A {
// 方法有参数
public static function foo($str){ echo $str; }
}
?>

闪电似的

如上面的代码:类A中的foo方法无参数,类B在继承A后重写foo方法时加入了参数,因此会产生一个类似下面E_STRICT级别的警告:

Strict standards: Declaration of ... should be compatible with that of

代码如下  
<?php
abstract class A {
// 方法无参数
public static function foo(){ echo 'bar'; }
}

abstract class B extends A {
// 方法有参数
public static function foo($str = NULL){ echo $str; }
}
?>

类B在重写foo方法时为新加入的参数指定一个默认值即可

真正原因:

其实如果子类重写方法的参数和基类不一样,只要给参数个默认值,使得编译器认为参数可以为空,保持重写方法与基类方法的函数签名相同就可以了。
经常用JAVA的同学肯定知道,在JAVA或者C++中,重写方法的函数签名本应该就和基类函数是一致的,我认为这也是符合自然规律的,因为override本来就是覆盖的意思嘛,既然覆盖了,那么就应该和原函数一致,不然怎么能“盖”的住呢~并且方法的重写多用在重写虚函数或者更明白的说就是重写接口的函数,如果重写的时候函数签名都不一致了,还要接口干嘛呢。。。
所以PHP的新版本中,我觉得定义这个E_STRICT的警告错误是很有用处的,要提醒程序员自己的重写方法到底对不对。

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

转载于:https://www.cnblogs.com/xiaoleiel/p/8334351.html

php方法重写:Declaration of should be compatible with that相关推荐

  1. php 重写方法should be compatible with,php方法重写:Declaration of should be compatible with that_PHP教程...

    php方法重写:Declaration of should be compatible with that 如果你碰到php 方法重写,参数不同,报错: Declaration of should b ...

  2. PHP报错:Declaration of ... should be compatible with ... 的解决方法

    ​ 背景情况 今天把本地环境的PHP版本升级到了PHP7,之前一直用的是5.5,升级之后发现报了一个警告错误:Warning: Declaration of (类方法1) should be comp ...

  3. java子类对象和成员变量的隐写方法重写

    1.子类继承的方法只能操作子类继承和隐藏的成员变量名字类新定义的方法可以操作子类继承和子类新生命的成员变量,但是无法操作子类隐藏的成员变量(需要适用super关键字操作子类隐藏的成员变量.) publ ...

  4. C++学习笔记24,方法重写与方法隐藏

    该博文仅用于交流学习.请慎用于不论什么商业用途.本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 方法重写.是指在子类中又一 ...

  5. Java Arrays.Sort方法重写

    当原始的java sort方法无法满足我们的需求时候,我们需要自定义一些排序方法,此时需要重写Array.sort方法重写. 模板代码如下,默认是从小到大排序的,如果想从大到小,把a-b换为b-a即可 ...

  6. 从jvm角度看懂类初始化、方法重写、重载。

    类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...

  7. Java 方法重载 方法重写

    方法重载规则 参数个数不同 参数个数相同,但参数列表中对应的某个参数的类型不一样 方法的返回类型和参数名称不参与重载 "编译期绑定",,因为未产生对象,只看参数.引用类型绑定方法 ...

  8. Java记录 -24- equals方法重写

    Java equals方法重写 假如我们要求,当两个学生的id一样时就是同一个人,代码实现如下: public class EqualsTest {public static void main(St ...

  9. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

最新文章

  1. MongoDB安装和MongoChef可视化管理工具的使用
  2. Java实用教程笔记 接口与实现
  3. SharePoint 2013 创建一个搜索中心和搜索设置
  4. 【PC工具】更新win10关闭更新工具及注意事项
  5. 巧用DOS命令合并多个文本文件的内容
  6. WebDriver高级应用实例(7)
  7. C代码中如何调用C++ C++中如何调用C
  8. composer配置阿里云镜像
  9. 为解决半导体供应短缺问题,全球半导体厂商迅速增产
  10. matplotlib基本设置
  11. sap abap开发从入门到精通_云端的ABAP Restful服务开发
  12. python爬取碧蓝航线所有战舰头像
  13. 计算机公式与函数的定义及两者的关系,excel(公式与函数).ppt
  14. C++实现求最大访客数
  15. SecureCRT 软件完全汉化
  16. 11g 配置 dgmgrl 以及报错 DataGuard ORA-00313,
  17. 西安知名IT互联网公司—为自己回西安做铺垫
  18. PAT 甲级1121 Damn Single
  19. MySQL系列3—标准SQL语言
  20. 柯尼卡美能达Konica Minolta magicolor 2300DL 打印机驱动

热门文章

  1. 【万人千题】结对编程排位赛(第一期) 第二周 排名公布,冠军成功卫冕,啊这……
  2. 仅1799元起,iQOO Z5火热预售中:满血配置超长续航
  3. 内核proc参数注释(kernel、vm、net、fs四类)
  4. 软件测试工程师-职业规划发展
  5. 解决pip安装包报错:WARNING: Retrying (Retry(XXX) after connection broken by ‘ProxyError(‘
  6. UI设计思想和工具_1
  7. FineBI 取日期的最大max、最小值min
  8. PowerBI-时间智能函数-LAST系列
  9. php——webshell变形总结
  10. 笔记 - 汽车之家的反爬手段