使用 POO PHP 时,使用子签名不起作用

问题描述 投票:0回答:1

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
1个回答
0
投票

PHP 没有方法重载,只有重写。

重载与面向对象相关,PHP 不像 Java 和 C# 那样支持这种模型。

使用松散函数,从程序上和功能上来说,不存在重载,仅接收具有相同“父”元素的遗传链的参数,也就是说,从遗传上讲,它们属于相同类型。

使用 OOP,这种情况不会发生,您必须具有相同的签名(即使它们具有相同的类型),并且即使“专业化(FormRequest)”不违反契约,参数数量也相同并且必须维持他们之间的秩序。

我看到一些人评论说违反了里氏原则(SOLID),但我不能将其视为违反合同,因为我正在创建一个拥有父对象拥有的一切的子对象,也就是说,如果父亲调用方法Y,孩子会拥有它并且应用程序将继续工作,无论如何......

© www.soinside.com 2019 - 2024. All rights reserved.