游客

PHP零基础教程-第八课-面向对象编程与MVC

一言准备中...

一、面向对象编程(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);
    }

    // 其他通用方法...
}
?>

五、作业练习

  1. 将之前的博客系统重构为MVC架构:

    • 实现清晰的目录结构
    • 使用面向对象方式编写模型
    • 分离视图逻辑
  2. 添加用户权限控制:

    • 实现角色系统(管理员/普通用户)
    • 添加中间件检查权限
    • 实现文章所有权验证
  3. 使用Composer引入一个第三方包:

    • 如HTML Purifier过滤用户输入
    • 或Monolog实现日志记录
  4. 实现简单的缓存系统:

    • 为热门文章添加缓存
    • 使用文件缓存或内存缓存
    • 实现缓存过期机制

六、现代PHP开发趋势

  1. PSR标准:遵循PHP-FIG的接口规范
  2. 依赖注入:使用容器管理对象依赖
  3. 中间件管道:处理HTTP请求的过滤链
  4. 领域驱动设计:复杂业务逻辑的组织方式

下节课预告

  • Laravel框架入门
  • 路由与Blade模板
  • Eloquent ORM使用
  • 构建现代化PHP应用

建议开始使用Git进行版本控制,并尝试在GitHub上托管你的代码!

  • 本文作者:菜鬼
  • 本文链接: https://caigui.net/pljcjc--dbk-mxdxbcymjg.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
130
4
0
1
梦想不大,创造神话。

PHP零基础教程-第七课--数据库进阶与RESTful API

上一篇

PHP零基础教程-第九课-Laravel框架入门

下一篇
评论区
内容为空

这一切,似未曾拥有