为什么php不满意公共方法签名与父私有方法签名不兼容?

时间:2016-06-13 14:47:02

标签: php inheritance visibility

以下代码

<?php

class A {
    private function test($str = null) {
        echo $str;
    }
}

class B extends A {
    public function test() {
        echo 'b';
    }
}

$b = new B();
$b->test();

给出

  

警告:B :: test()声明应与第13行/ in / oCG5c中的A :: test($ str = NULL)兼容

证明here

这是为什么?注意父方法是如何私有的,请注意这对于hhvm来说这不是一个问题,并注意php 7如何将其提升为警告。

更新:为了使事情更清楚一点,下面的代码片段,如预期的那样,gives no warning

<?php

class A {
    private function test($str = null) {
        echo $str;
    }
}

class B extends A {
    private function test() {
        echo 'b';
    }
}

$b = new B();

如果它有所帮助,这里有一个小小的提示,告诉我们属性的私有方式:

<?php

class A
{
    private $a;
}

class B extends A
{
    private $a;
}

$b = new B();
var_dump($b);
  

对象(B)#1(2){[&#34; a&#34;:&#34; B&#34;:private] =&gt; NULL [&#34; a&#34;:&#34; A&#34;:private] =&gt; NULL}

拥有两个具有相同名称的私有属性就可以了。它应该用于方法。

0 个答案:

没有答案