# 技术点 **Repository Path**: php-framework/php_technical_point ## Basic Information - **Project Name**: 技术点 - **Description**: 技术点:设计模式、静态成员、实例成员、封装、继承、多态、抽象、接口、依赖注入、重写、重载、trait... - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-13 - **Last Updated**: 2026-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PHP 技术要点 (PHP Technical Point) 本项目展示了 PHP 中的重要技术概念,包括 `self` 与 `static` 的区别、Trait 的使用以及设计模式的应用。 ## 核心概念 ### 1. 静态成员 vs 实例成员 特性静态成员实例成员所属关系属于类,所有实例共享属于实例,每个对象独立访问方式类名::成员或 self::/static:: 对象实例->静态方法(不推荐) 对象实例::静态属性(PHP 8.0+)$this->成员 或者 $对象->成员是否实例化不需要,可直接通过类名访问需要先创建对象内存分配类加载时分配一次每创建对象分配一次生命周期从类加载到脚本结束从对象创建到对象销毁访问静态成员✅ 使用 self::或 static::✅ 可以使用 self::或类名访问非静态成员❌ 不能直接访问非静态属性/方法✅ 可以访问非静态成员,也可访问静态成员适用场景工具方法、单例、共享数据、计数器业务逻辑、有状态的对象 ```php class Account { public static $name = "李四"; public $status = 1; public static function add() { echo("self:静态方法访问静态属性:".self::$name."\n"); echo("static:静态方法访问静态属性:".static::$name."\n"); var_dump("account add ..."); } public function edit() { var_dump("account edit ..."); } public function demo() { echo("self:非静态方法访问静态属性:".self::$name."\n"); echo("static:非静态方法访问静态属性:".static::$name."\n"); } } class CCC extends Account { public static function add() { var_dump("ccc add ..."); } public function test() { echo("子类方法访问父类的静态属性:".parent::$name."\n"); parent::add(); } } // 访问静态成员 var_dump(Account::$name); var_dump(Account::add()); $c = new CCC(); $c->demo(); CCC::add(); $c->test(); ``` ### 2. Trait Trait 是 PHP 中实现代码复用的机制,允许开发者声明可在其他类中重用的方法组。 a.代码复用机制,解决单继承中代码共享的局限性。 b.横向复用:将方法“水平组合”到类中。 c.优先级规则:当前类中的方法 > Trait 中的方法 > 父类中的方法 d.可以声明抽象方法,要求使用它的类必须实现 e.也支持静态属性和静态方法 f.不能实例化、不能定义常量、可嵌套、不宜过度使用 g.编译时 trait 代码会复制到类中(类似“复制粘贴”),运行时无性能损耗 h.实用场景示例 i.单例模式复用 ii.数据验证辅助 ```php add([]); MovieService::getInstance('movie-service')->delete([]); MovieService::getInstance('movie-service')->detail(1); MovieService::getInstance('movie-service')->detail('1212'); ``` ### 3. 多态 i.同一操作作用于不同对象时,可以得到不同的结果,即一个接口,多种实现. ii.允许将子类对象视为父类类型,调用同一个方法时,实际执行的是子类自己的实现. iii.通过继承/抽象类和接口来实现,结合类型声明,实现代码的高扩展、低耦合的结构. i.父类引用指向子类对象.【或接口引用指向实现类对象】 ii.运行时动态绑定:调用哪个方法由实际对象决定,而不是由引用类型决定. iii.里氏替换原则:子类可以无缝替换父类,而不影响程序正确性. iv.父类类型的参数可以接收任何子类对象,因为子类继承了父类的全部契约(公共方法/属性)并可以扩展或改写其行为. ```php // 父类:定义了 speak 规范 class Animal { protected string $name; public function __construct(string $name) { $this->name = $name; } public function speak(): string { return '...'; // 默认实现 } } // 子类 Dog 重写 speak class Dog extends Animal { public function speak(): string { return $this->name . ' says Woof!'; } } // 子类 Cat 重写 speak class Cat extends Animal { public function speak(): string { return $this->name . ' says Meow!'; } } // 多态函数:参数类型声明为父类 Animal function makeSound(Animal $animal): void { echo $animal->speak() . PHP_EOL; } // 传入不同的子类对象,执行不同的 speak 逻辑 makeSound(new Dog('Buddy')); // Buddy says Woof! makeSound(new Cat('Kitty')); // Kitty says Meow! interface Shape { public function area(): float; } class Circle implements Shape { public function __construct(private float $radius) {} public function area(): float { return pi() * $this->radius ** 2; } } class Rectangle implements Shape { public function __construct(private float $width, private float $height) {} public function area(): float { return $this->width * $this->height; } } // 多态函数:参数类型声明为接口 function printArea(Shape $shape): void { echo get_class($shape) . ' area: ' . $shape->area() . PHP_EOL; } printArea(new Circle(5)); // Circle area: 78.5398... printArea(new Rectangle(4, 6)); // Rectangle area: 24 abstract class Payment { abstract protected function validate(): bool; public function pay(float $amount): string { if (!$this->validate()) { return 'Payment failed'; } return "Paid $amount using " . $this->getMethod(); } abstract public function getMethod(): string; } class CreditCard extends Payment { protected function validate(): bool { /* 信用卡校验 */ return true; } public function getMethod(): string { return 'Credit Card'; } } class PayPal extends Payment { protected function validate(): bool { /* PayPal校验 */ return true; } public function getMethod(): string { return 'PayPal'; } } function process(Payment $payment, float $amount) { echo $payment->pay($amount) . PHP_EOL; } process(new CreditCard(), 100); process(new PayPal(), 200); ``` ## 许可证 本项目仅供学习和参考使用。