PHP中的面向对象编程(OOP)是一种编程范式,它使用"对象"来设计应用程序和程序。对象是数据和操作数据的方法的集合。
class Car {
// 属性
public $color;
private $model;
// 方法
public function setModel($model) {
$this->model = $model;
}
public function getModel() {
return $this->model;
}
}
// 创建对象
$myCar = new Car();
$myCar->color = "red";
$myCar->setModel("Tesla");
echo $myCar->getModel(); // 输出: Tesla
public
:任何地方都可访问protected
:类自身和子类可访问private
:仅类自身可访问class Vehicle {
protected $wheels;
public function setWheels($num) {
$this->wheels = $num;
}
}
class Bike extends Vehicle {
public function showWheels() {
echo "我有 {$this->wheels} 个轮子";
}
}
$myBike = new Bike();
$myBike->setWheels(2);
$myBike->showWheels(); // 输出: 我有 2 个轮子
// 接口
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
file_put_contents('log.txt', $message, FILE_APPEND);
}
}
// 抽象类
abstract class Animal {
abstract public function makeSound();
public function eat() {
echo "正在吃东西";
}
}
class Magic {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
return $this->data[$name] ?? null;
}
public function __call($name, $arguments) {
echo "调用了不存在的方法: $name";
}
}
原因:类文件未正确引入或类名拼写错误
解决:
// 使用自动加载
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
原因:方法名拼写错误或方法不存在
解决:
method_exists()
检查方法是否存在__call()
魔术方法处理未知方法调用原因:尝试访问私有/受保护属性
解决:
__get()
和__set()
魔术方法原因:子类覆盖父类方法时参数不匹配
解决:
class ParentClass {
public function example(int $param): string {
return (string)$param;
}
}
class ChildClass extends ParentClass {
// 参数和返回类型必须匹配
public function example(int $param): string {
return "Child: " . parent::example($param);
}
}
通过合理使用PHP的OOP特性,可以构建更健壮、可维护和可扩展的应用程序。