跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP方法重写
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP方法重写 = '''方法重写'''(Method Overriding)是PHP面向对象编程中实现'''多态性'''的核心技术之一,允许子类重新定义从父类继承的方法。当子类对象调用被重写的方法时,将执行子类中的版本而非父类版本。 == 基础概念 == === 定义 === 方法重写发生在继承体系中,需满足以下条件: * 子类方法与父类方法'''名称完全相同''' * 子类方法的'''参数数量'''必须与父类一致(PHP 7.4+ 支持协变参数) * 访问修饰符的可见性不能降低(如父类为`protected`则子类不能改为`private`) === 与重载的区别 === {| class="wikitable" |- ! 方法重写 (Overriding) !! 方法重载 (Overloading) |- | 发生在继承关系中 || 发生在同一类内 |- | 方法签名必须相同 || 方法名相同但参数不同 |- | 运行时多态 || 编译时多态(PHP通过魔术方法模拟) |} == 基本语法 == <syntaxhighlight lang="php"> class ParentClass { public function showMessage() { echo "Parent message\n"; } } class ChildClass extends ParentClass { // 重写父类方法 public function showMessage() { echo "Child message\n"; parent::showMessage(); // 可选:调用父类原始方法 } } $obj = new ChildClass(); $obj->showMessage(); </syntaxhighlight> '''输出:''' <pre> Child message Parent message </pre> == 高级特性 == === 访问修饰符规则 === * 子类方法可以'''放宽'''但不能'''收紧'''访问限制: ** 父类`protected` → 子类可改为`public` ** 父类`public` → 子类'''不可'''改为`protected/private` === final 关键字 === 父类可禁止方法被重写: <syntaxhighlight lang="php"> class SecureClass { final public function criticalMethod() { // 此方法不能被子类重写 } } </syntaxhighlight> === 构造方法重写 === 特殊场景下的注意事项: <syntaxhighlight lang="php"> class Parent { public function __construct($param) { echo "Parent constructor with $param\n"; } } class Child extends Parent { public function __construct($param, $extra) { parent::__construct($param); // 必须显式调用父类构造方法 echo "Child constructor with $extra\n"; } } </syntaxhighlight> == 实际应用案例 == === 支付系统示例 === <mermaid> classDiagram class PaymentGateway { +processPayment() void } class CreditCardPayment { +processPayment() void } class PayPalPayment { +processPayment() void } PaymentGateway <|-- CreditCardPayment PaymentGateway <|-- PayPalPayment </mermaid> <syntaxhighlight lang="php"> abstract class PaymentGateway { abstract public function processPayment($amount); } class CreditCardPayment extends PaymentGateway { public function processPayment($amount) { // 信用卡特定处理逻辑 return "Processing $$amount via Credit Card"; } } class PayPalPayment extends PaymentGateway { public function processPayment($amount) { // PayPal特定处理逻辑 return "Processing $$amount via PayPal"; } } function checkout(PaymentGateway $gateway, $amount) { echo $gateway->processPayment($amount); } checkout(new CreditCardPayment(), 100); // 输出信用卡处理 checkout(new PayPalPayment(), 50); // 输出PayPal处理 </syntaxhighlight> == 常见问题 == === 方法签名变更 === PHP 7.4+ 支持'''协变返回类型'''和'''逆变参数''': <syntaxhighlight lang="php"> interface Factory { public function make(): object; } class UserFactory implements Factory { public function make(): User; // 协变:返回更具体类型 } </syntaxhighlight> === 静态方法重写 === 静态方法在PHP中'''不具有多态性''': <syntaxhighlight lang="php"> class A { public static function test() { echo "A"; } } class B extends A { public static function test() { echo "B"; } } A::test(); // 输出 A B::test(); // 输出 B $obj = new B(); $obj::test(); // 输出 B(但这不是真正的多态) </syntaxhighlight> == 最佳实践 == # 使用`@override`注解(IDE支持)提高可读性 # 重写方法时保持'''里氏替换原则'''(LSP) # 复杂逻辑重写时调用`parent::method()`保留父类行为 # 对不应被重写的方法使用`final`修饰符 {{Warning|过度使用方法重写会导致代码难以维护,建议优先使用组合模式}} == 性能考量 == 方法重写会引入轻微的性能开销(约5-10%),因为: * 需要在运行时解析方法调用 * 涉及虚方法表(vtable)查找 * 但现代PHP版本(7.4+)已优化此过程 == 扩展阅读 == * [[PHP类型声明]](协变/逆变) * [[PHP抽象类与接口]] * [[设计模式中的模板方法模式]] [[Category:编程语言]] [[Category:PHP]] [[Category:PHP继承与多态]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)