1. 基础概念与动机
1.1 类与对象的基本概念
类是对象的模板,定义了属性和方法的集合,用于描述同类对象的共性与行为。通过类可以实例化具体的对象,对象是类的实例,携带状态与行为,成为程序中的现实载体。
在 PHP 面向对象编程中,理解类和对象的分工关系是后续学习的基石。你可以把类看作模板,把对象当成按照模板创建的具体实例。
例如下面的代码展示了一个简单的类以及如何通过构造函数创建对象:
name = $name;}public function greet() {return "Hello, " . $this->name;}
}
$u = new User("Alice");
echo $u->greet();
?>
构造函数(__construct)在对象创建时自动调用,帮助初始化状态;而对象的生命周期由 GC 与脚本执行结束共同决定。
1.2 属性与方法的访问控制
对象的状态通过属性(字段)来保存,行为通过方法(函数)来实现。访问控制修饰符决定了谁可以访问这些成员。
在 PHP 中,常用的访问修饰符有 public、private、protected,它们分别表示对外公开、仅限类内部、以及对子类可用的访问范围。
下面的示例演示了不同修饰符的用法:
balance += $amount;}
}
?>
2. PHP 的对象模型与语法要点
2.1 类的定义与命名空间
在实际项目中,命名空间(namespace)用于避免类名冲突,并帮助组织代码结构。通过 命名空间与 use 可以实现清晰的依赖管理。
下面展示一个简单的命名空间示例,说明如何定义与使用命名空间中的类:
在使用端通过 use App\Models\Product; 进行引入,并创建对象:
id = 101;
$p->name = "键盘";
?>
2.2 构造函数、析构函数与自定义初始化
构造函数(__construct)用于对象创建时的初始化,析构函数(__destruct)在对象销毁时执行清理工作。自定义初始化逻辑有助于确保对象进入一致状态。
下面的示例展示了如何在类中实现构造与析构,以及简单的资源管理:
handle = fopen($path, 'a');}public function log($msg) {fwrite($this->handle, $msg . PHP_EOL);}public function __destruct() {if ($this->handle) {fclose($this->handle);}}
}
?>
2.3 公共、私有、受保护访问修饰符的实际应用
通过对成员变量与方法设置不同的访问修饰符,可以实现良好的封装性与职责分离。封装是降低耦合、提升可维护性的关键。
下面的示例说明了如何在一个类中对关键数据进行封装,并提供公开的访问接口:
dbConnection = $db;}public function getUser($id) {// 通过公开方法访问内部数据实现封装return $this->dbConnection->query("SELECT * FROM users WHERE id = ".$id);}
}
?>
3. 面向对象的设计原则与实战要点
3.1 单一职责原则在 PHP 代码中的应用
每个类应该只有一个明确的职责,避免将多种行为混杂在同一个类中。遵循单一职责原则(SRP)有助于代码的可测试性与可维护性。
在实际开发中,可以把数据访问、业务逻辑、以及输出呈现等职责拆分到独立的类中,并通过依赖注入来组合它们。
示例:将数据访问与业务逻辑拆分为不同的类,以实现职责分离:
repo = $repo;}public function getProfile($id) {return $this->repo->find($id);}
}
?>
3.2 继承、接口与多态
继承通过扩展来实现行为复用;接口定义了能力契约,确保不同实现具备统一的方法集合。多态让同一接口在不同对象上有不同实现,提升灵活性。
以下示例演示了一个简单的接口与实现:
3.3 命名空间和自动加载(PSR-4)
为提升可维护性,应采用规范化的自动加载机制。PSR-4 是常见的自动加载标准,结合 Composer 使用可以根据命名空间自动加载类。
示例:在 composer.json 中配置自动加载:PSR-4 配置,并将类文件放在相应的目录结构下:
{"autoload": {"psr-4": {"App\\": "src/"}}
}
通过命名空间与自动加载,依赖管理与类定位变得更加简洁,降低了模块耦合度。
4. 常用的 PHP 面向对象技巧
4.1 静态成员与工厂模式
静态成员用于无需实例化即可访问的共有能力,工厂模式通过静态方法创建对象,降低客户端对构造细节的依赖。
下面是一个简单的工厂模式示例:
4.2 魔术方法的使用场景
PHP 的魔术方法提供对对象行为的扩展能力,如 __get、__set、__call、__toString 等,可实现动态属性、方法或对象字符串化等能力。
示例:通过 __get 动态访问未定义的键值:
data[$name] ?? null;}public function __set($name, $value) {$this->data[$name] = $value;}
}
$d = new Dynamic();
$d->foo = "bar";
echo $d->foo;
?>
4.3 组合、依赖注入与解耦
通过组合和依赖注入来实现解耦,提升代码的可测试性与替换性。将依赖(如仓储、服务、组件)通过构造函数注入,而不是在内部直接创建。
示例:通过接口注入依赖的实现:
repo = $repo;}public function getUser($id) {return $this->repo->find($id);}
}
?>



