PHP 版本:8.2.17
有效:
class Request {}
class FormRequest extends Request {}
function test(Request $request) {
print_r('buuu!' . get_class($request));
}
test(new FormRequest());
结果:
buuu!FormRequest
它不起作用:
class Request {}
class FormRequest extends Request {}
class Animal {
public function test(Request $request) {}
}
class Giraffe extends Animal {
public function test(FormRequest $request) {
print_r('buuu!' . get_class($request));
}
}
(new Giraffe())->test(new FormRequest());
结果:
Fatal error: Declaration of Giraffe::test(FormRequest $request) must be compatible with Animal::test(Request $request) in /home/user/scripts/code.php on line 14
现在问题来了:与便便相比有什么区别?
PHP 没有方法重载,只有重写。
重载与面向对象相关,PHP 不像 Java 和 C# 那样支持这种模型。
使用松散函数,从程序上和功能上来说,不存在重载,仅接收具有相同“父”元素的遗传链的参数,也就是说,从遗传上讲,它们属于相同类型。
使用 OOP,这种情况不会发生,您必须具有相同的签名(即使它们具有相同的类型),并且即使“专业化(FormRequest)”不违反契约,参数数量也相同并且必须维持他们之间的秩序。
我看到一些人评论说违反了里氏原则(SOLID),但我不能将其视为违反合同,因为我正在创建一个拥有父对象拥有的一切的子对象,也就是说,如果父亲调用方法Y,孩子会拥有它并且应用程序将继续工作,无论如何......