同一语言中的两个世界:为什么这很重要?
当我们谈论PHP时,首先想到的是经典的面向对象编程(OOP)。类、继承、封装——这是所有课程中教授的基础知识。但还有另一面——函数式编程方法。你知道吗?PHP两者都支持,而且做得非常好。
在本文中,我们不会争论哪种方法更好。我们将分析何时以及应该使用哪种方法,以使您的代码不仅美观,而且高效。如果您正在使用PHP编写代码,并希望超越“能用就行”的层次,那么这篇文章适合您。
面向对象PHP:永不褪色的经典
PHP中的OOP关乎结构和复用。您创建描述应用程序实体的类:用户、订单、商品。每个类负责自己的职责范围。
示例:通过OOP处理用户
让我们看一个典型示例。假设我们需要创建一个用户并发送一封欢迎邮件。
<?phpclass User { private string $name; private string $email;
public function __construct(string $name, string $email) { $this->name = $name; $this->email = $email; }
public function sendWelcomeEmail(): void { $subject = "欢迎您,{$this->name}!"; $message = "您好,{$this->name}。很高兴在我们的网站上见到您。"; mail($this->email, $subject, $message); }
public function getName(): string { return $this->name; }}
$user = new User("伊万", "ivan@example.com");$user->sendWelcomeEmail();echo "邮件已发送给用户:" . $user->getName();?>这里一切都很合理:数据(姓名、邮箱)和方法(发送邮件)位于同一位置。当您对同一实体进行多种不同操作时,这很方便。
PHP中OOP的优点
- 可读性:代码被划分为逻辑块,易于找到所需方法。
- 继承:可以创建基类并对其进行扩展。
- 封装:数据受到保护,防止意外修改(private/protected)。
- 多态:同一接口,不同实现。
OOP的缺点
- 冗余:对于简单任务(例如格式化字符串),编写一个类是大材小用。
- 状态:对象存储状态,如果不注意变更,可能导致错误。
- 内存:每个对象比简单函数占用更多内存。
函数式PHP:极简与纯粹
PHP中的函数式编程不仅仅是“编写一个函数”。这是一种哲学,其中函数是主角。它们没有副作用,不改变全局状态,并且始终返回可预测的结果。
示例:同样的任务,但用函数式方法
让我们解决同样的任务——创建用户并发送邮件——但不使用类。
<?phpfunction createUser(string $name, string $email): array { return ['name' => $name, 'email' => $email];}
function sendWelcomeEmail(array $user): void { $subject = "欢迎您,{$user['name']}!"; $message = "您好,{$user['name']}。很高兴在我们的网站上见到您。"; mail($user['email'], $subject, $message);}
function getUserName(array $user): string { return $user['name'];}
$user = createUser("伊万", "ivan@example.com");sendWelcomeEmail($user);echo "邮件已发送给用户:" . getUserName($user);?>看起来更简单?是的。但这里没有封装——数据只是一个数组。然而,每个函数只做一件事,并且对“外部世界”一无所知。