php严格错误包括

mif*_*ife 6 php strict

如果类在这样的文件中,则看起来不会发生严格错误:

abstract class Food{}

class Meat extends Food{}                    

abstract class Animal{          
    function feed(Food $food){ }
}

class Cat extends Animal{           
    function feed(Meat $meat){
        parent::feed($meat);
    }   
}    
Run Code Online (Sandbox Code Playgroud)

但是如果你把类定义放在单独的文件中并包含它们:

abstract class Food{}

class Meat extends Food{}                    

require 'Animal.php';
require 'Cat.php';
Run Code Online (Sandbox Code Playgroud)

抛出严格的标准错误消息:

严格标准:声明Cat::feed()应与Animal::feed(Food $food)c:\ path\to\Cat.php在线兼容......

如果all都在一个文件中,即使这样也可以:

class Dog extends Animal{           
  function feed($qty = 1){ 
    for($i = 0; $i < $qty; $i++){
        $Meat = new Meat();
        parent::feed($Meat);
    }       
  } 
}
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

因为Meat是a Food,首先不应该有抱怨,对吧?因此解决方案简单明了:将所有内容放在一个文件中并满足严格的标准;)

任何提示赞赏

Ja͢*_*͢ck 3

这是预期的行为吗?

不幸的是,是的。类声明的复杂性使得当它们都出现在同一个脚本中时并不总是应用严格的规则;每个文件一个类不会出现此问题。

因为肉是一种食物,所以一开始就不应该抱怨,对吧?

错误有两个原因:

  1. 肉类是比食物更小的类型,因此在你的后代类中只允许更小的类型,你就违反了LSP;你无法Cat替代Animal.

  2. 在 PHP 中,重载方法时参数类型是不变的,即接受的类型必须与父级的类型完全匹配。虽然可以说逆变类型是有意义的,但由于技术原因这是不可能做到的。

因此,解决方案简单明了:将所有内容放入一个文件中,并且满足严格的标准;)

不,你绝对不应该依赖这种行为。