一、面向对象编程(OOP)进阶
1. 类与对象深入
(1) 完整的类定义
<?php
class Article {
// 属性
private $id;
public $title;
protected $content;
public static $table = 'articles';
// 构造方法
public function __construct($title, $content, $id = null) {
$this->id = $id;
$this->title = $title;
$this->content = $content;
}
// 方法
public function save() {
// 保存到数据库的逻辑
}
// 静态方法
public static function find($id) {
// 查询数据库返回Article对象
}
// 魔术方法
public function __toString() {
return $this->title;
}
}
?>
(2) 继承与多态
<?php
class Post extends Article {
private $author;
public function __construct($title, $content, $author) {
parent::__construct($title, $content);
$this->author = $author;
}
// 方法重写
public function save() {
// 扩展保存逻辑
parent::save();
// 额外操作
}
}
?>
2. 接口与抽象类
(1) 接口实现
<?php
interface Loggable {
public function log($message);
}
class DatabaseLogger implements Loggable {
public function log($message) {
// 实现日志记录到数据库
}
}
?>
(2) 抽象类
<?php
abstract class Model {
protected $table;
abstract public function save();
public function delete($id) {
// 通用删除逻辑
}
}
class User extends Model {
protected $table = 'users';
public function save() {
// 具体实现
}
}
?>
3. 命名空间与自动加载
(1) 命名空间使用
<?php
namespace App\Models;
class Article {
// 类实现
}
// 使用类
$article = new \App\Models\Article();
?>
(2) Composer自动加载
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
运行 composer dump-autoload
生成自动加载文件
二、MVC架构模式
1. MVC组件解析
- Model(模型): 数据处理和业务逻辑
- View(视图): 用户界面展示
- Controller(控制器): 接收请求并协调模型和视图
2. 简单MVC实现
(1) 目录结构
app/
controllers/
ArticleController.php
models/
Article.php
views/
articles/
index.php
show.php
public/
index.php
(2) 控制器示例
<?php
// app/controllers/ArticleController.php
namespace App\Controllers;
use App\Models\Article;
class ArticleController {
public function index() {
$articles = Article::all();
require '../views/articles/index.php';
}
public function show($id) {
$article = Article::find($id);
require '../views/articles/show.php';
}
}
?>
(3) 模型示例
<?php
// app/models/Article.php
namespace App\Models;
class Article {
public static function all() {
// 返回所有文章
}
public static function find($id) {
// 查询单篇文章
}
}
?>
(4) 视图示例
<!-- app/views/articles/index.php -->
<!DOCTYPE html>
<html>
<body>
<?php foreach($articles as $article): ?>
<h2><?= htmlspecialchars($article->title) ?></h2>
<?php endforeach; ?>
</body>
</html>
3. 前端控制器模式
<?php
// public/index.php
require '../vendor/autoload.php';
$request = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
switch ($request) {
case '/articles':
$controller = new App\Controllers\ArticleController();
if ($method === 'GET') {
$controller->index();
}
break;
case preg_match('|^/articles/(\d+)$|', $request, $matches) ? true : false:
$controller = new App\Controllers\ArticleController();
$controller->show($matches[1]);
break;
default:
http_response_code(404);
echo '404 Not Found';
break;
}
?>
三、Composer依赖管理
1. 常用PHP包
- 数据库: doctrine/dbal
- HTTP请求: guzzlehttp/guzzle
- 模板引擎: twig/twig
- 测试: phpunit/phpunit
2. 安装使用示例
composer require twig/twig
<?php
require 'vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader('views');
$twig = new \Twig\Environment($loader);
echo $twig->render('index.twig', ['name' => 'PHP']);
?>
四、实战:重构博客系统
1. MVC目录结构调整
app/
config/
controllers/
models/
views/
public/
assets/
index.php
vendor/
tests/
2. 使用PDO数据库抽象层
<?php
// app/config/database.php
class Database {
private static $instance = null;
private $connection;
private function __construct() {
$this->connection = new PDO(
'mysql:host=localhost;dbname=blog',
'username',
'password'
);
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new Database();
}
return self::$instance->connection;
}
}
?>
3. 模型基类实现
<?php
// app/models/Model.php
namespace App\Models;
use App\Config\Database;
abstract class Model {
protected static $table;
public static function all() {
$db = Database::getInstance();
$stmt = $db->query("SELECT * FROM " . static::$table);
return $stmt->fetchAll(PDO::FETCH_CLASS, static::class);
}
// 其他通用方法...
}
?>
五、作业练习
-
将之前的博客系统重构为MVC架构:
- 实现清晰的目录结构
- 使用面向对象方式编写模型
- 分离视图逻辑
-
添加用户权限控制:
- 实现角色系统(管理员/普通用户)
- 添加中间件检查权限
- 实现文章所有权验证
-
使用Composer引入一个第三方包:
- 如HTML Purifier过滤用户输入
- 或Monolog实现日志记录
-
实现简单的缓存系统:
- 为热门文章添加缓存
- 使用文件缓存或内存缓存
- 实现缓存过期机制
六、现代PHP开发趋势
- PSR标准:遵循PHP-FIG的接口规范
- 依赖注入:使用容器管理对象依赖
- 中间件管道:处理HTTP请求的过滤链
- 领域驱动设计:复杂业务逻辑的组织方式
下节课预告
- Laravel框架入门
- 路由与Blade模板
- Eloquent ORM使用
- 构建现代化PHP应用
建议开始使用Git进行版本控制,并尝试在GitHub上托管你的代码!
这一切,似未曾拥有