在php官网手册中:http://php.net/manual/en/language.oop5.basic.php
extends那一节中,有这样一段话。
When overriding methods, the parameter signature should remain the same or PHP will generate an E_STRICT level error. This does not apply to the constructor, which allows overriding with different parameters. 我的理解:重写方法,参数应该要和父类一样,否则会产生E_STRICT级别错误。但是,我测试却不是。
环境:PHP 5.6.31 (cli) (built: Jul 10 2017 11:54:08)<?php
error_reporting(E_ALL);
class A
{
    function c($a) {
        echo $a;
    }
}class B extends A
{
    // 和父类一样名字,参数不同。
    function c($a, $b)
    {
        echo $a, $b;
    }
}$b = new B;
$b->c('bb','hhh');运行正常,不报错。
[root@localhost php_1]# /opt/lampp/bin/php index.php 
bbhhh

解决方案 »

  1.   

    Strict Standards: Declaration of B::c() should be compatible with A::c($a) in D:\phpStudy\WWW\test\test.php on line 17
    bbhhh
      

  2.   

    Strict Standards: Declaration of B::c() should be compatible with A::c($a)
      

  3.   

    啊 找到原因了首先手册上的描述和您的理解是没有任何问题的:
    在严格模式(E_STRICT)下
    当在子类重写父类方法时 子类的参数列表应该保持与父类的声明一致
    如果不一致 将抛出一个Strict Standards的错误提示(如楼上二位所示)
    但构造函数对此规则是个例外 也就是说重写构造函数时允许子类与父类的参数列表不同起初
    在我的PHP7环境下 将您的代码执行后 代码已经抛出了E_Warning级别的错误了
      

  4.   


    sorry 手滑不小心提交了...下面继续回答这意味着在您的5.6环境下严格模式的规则
    在PHP7或者更高版本中已经升级成了普通的warning级别错误了至此我认为可能是版本问题 因此我下载了官方的PHP5.6.31版本(与您的环境相同)测试
    解压缩了php.exe后 我直接复制了代码 并用php.exe来运行
    确实如您所描述的 我的运行结果也没有任何严格模式错误提示出现于是我考虑是否在5.6.31版本下 E_ALL级别尚未包含E_STRICT级别(其实是包含的 E_ALL = 32767, E_STRICT = 2048)
    所以我调整了您代码的第一行:error_reporting(E_ALL | E_STRICT);并再次运行代码
    遗憾的是严格模式错误提示仍未出现
    至此问题陷入了僵局然后我考虑是否是与PHP初始配置中的error_reporting设置有关
    我再次调整代码 在第一行的前面加入代码 并立即退出var_dump(ini_get('error_reporting'));exit;这行代码的含义是获取初始的error_reporting
    代码运行后结果是空(因为我是全新下载的5.6.31的压缩包解压后立即调试 所以没有配置php.ini文件)随后我把exit去掉 在代码的开始处 通过error_reporting函数动态调整报错级别
    但此行并不能使严格模式错误提示出现此后我配置了php.ini文件
    添加error_reporting = E_ALL配置
    让脚本启动配置的报错级别就是最高
    随后再运行代码 终于出现了Strict Standards报错那么这种现象究竟说明了什么??
    首先需要稍微深入的了解一下PHP的运行流程:当我在命令行执行php.exe命令 并传入我的测试脚本文件路径后
    1.首先php会读取脚本文件 并进行语法检测
    2.编译这个php脚本文件
    3.最终执行这个php文件那么这个过程中有两个重要的时期
    一个是编译时, 一个是运行时
    上述的严格模式错误提示是在什么时期出现的??
    实际上它是在编译时出现的
    因为php的编译器在编译子类的时候 就能发现子类的重写已经违背了严格模式
    但一开始没有php.ini配置文件时 error_reporting报错级别为空
    因此我一开始的执行 没有报出严格模式错误
    而当运行时通过代码error_reporting()函数去修改报错级别为E_ALL时
    严格模式错误已经来不及报出了因此只有当我配置php.ini 并将error_reporting设置为E_ALL后
    在编译时期发现的严格模式错误才能正常报出
    而与运行时的报错级别动态修改已经无关了运行时修改的报错级别只能作用于运行时报错我想这就是上述现象的原因了
    楼主可以检查自己的php.ini配置 是否配好
      

  5.   

    呃...
    引用的时候又引错了楼层....
    再次sorry.....
      

  6.   

    error_reporting(E_ALL);运行时 Strict Standards 错误已经产生了!
      

  7.   

    Warning: Declaration of B::c($a, $b) should be compatible with A::c($a)
    php 7
      

  8.   

    重写方法,参数应该要和父类一样,否则会产生E_STRICT级别错误。