PHP项目如何从零开始搭建?

wen PHP项目 4

本文目录导读:

PHP项目如何从零开始搭建?

  1. 环境搭建
  2. 项目结构设计
  3. 创建入口文件
  4. 核心类实现
  5. 控制器和模型
  6. 应用初始化
  7. 数据库配置
  8. 视图模板
  9. 初始化项目
  10. 最佳实践建议

我来详细说明如何从零开始搭建一个PHP项目,包含环境搭建、项目结构设计和基本开发流程。

环境搭建

安装PHP开发环境

集成环境(推荐新手)

# Windows - XAMPP/WampServer
下载并安装 XAMPP 或 WampServer
# macOS - MAMP
下载并安装 MAMP
# Linux
sudo apt-get update
sudo apt-get install apache2 mysql-server php php-mysql

Docker环境(推荐进阶)

# docker-compose.yml
version: '3.8'
services:
  php:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
    depends_on:
      - mysql
    command: >
      docker-php-ext-install pdo pdo_mysql
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: my_db
    ports:
      - "3306:3306"

验证环境

<?php
// index.php
phpinfo(); // 查看PHP配置信息

项目结构设计

基础项目结构

my-project/
├── public/                 # 公开访问目录(Document Root)
│   ├── index.php          # 入口文件
│   ├── css/
│   ├── js/
│   └── images/
├── src/                   # PHP源代码
│   ├── Controllers/
│   ├── Models/
│   ├── Views/
│   ├── Helpers/
│   └── Config/
├── config/                # 配置文件
│   ├── database.php
│   └── app.php
├── vendor/                # 依赖库(Composer)
├── logs/                  # 日志文件
├── tests/                 # 测试文件
├── .env                   # 环境变量
├── .gitignore
├── composer.json
└── README.md

创建入口文件

前端控制器(index.php)

<?php
// public/index.php
// 错误报告(开发环境)
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 定义根目录
define('ROOT_PATH', dirname(__DIR__));
// 自动加载
require ROOT_PATH . '/vendor/autoload.php';
// 加载环境配置
$dotenv = Dotenv\Dotenv::createImmutable(ROOT_PATH);
$dotenv->load();
// 启动应用
use App\Core\Application;
$app = new Application();
$app->run();

.htaccess(Apache重写)

# public/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

核心类实现

路由类

<?php
// src/Core/Router.php
namespace App\Core;
class Router {
    private $routes = [];
    public function add($method, $uri, $handler) {
        $this->routes[] = [
            'method' => $method,
            'uri' => $uri,
            'handler' => $handler
        ];
    }
    public function dispatch($method, $uri) {
        foreach ($this->routes as $route) {
            if ($route['method'] === $method && $route['uri'] === $uri) {
                return call_user_func($route['handler']);
            }
        }
        // 404处理
        http_response_code(404);
        echo "404 Not Found";
    }
}

数据库连接

<?php
// src/Core/Database.php
namespace App\Core;
use PDO;
use PDOException;
class Database {
    private static $instance = null;
    private $connection;
    private function __construct() {
        $config = require ROOT_PATH . '/config/database.php';
        try {
            $this->connection = new PDO(
                "mysql:host={$config['host']};dbname={$config['dbname']}",
                $config['username'],
                $config['password'],
                [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                ]
            );
        } catch (PDOException $e) {
            die("Database connection failed: " . $e->getMessage());
        }
    }
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function getConnection() {
        return $this->connection;
    }
}

视图渲染

<?php
// src/Core/View.php
namespace App\Core;
class View {
    public static function render($view, $data = []) {
        $viewFile = ROOT_PATH . "/src/Views/{$view}.php";
        if (file_exists($viewFile)) {
            extract($data);
            require $viewFile;
        } else {
            throw new \Exception("View {$view} not found");
        }
    }
}

控制器和模型

基础控制器

<?php
// src/Controllers/BaseController.php
namespace App\Controllers;
use App\Core\View;
abstract class BaseController {
    protected function render($view, $data = []) {
        View::render($view, $data);
    }
    protected function json($data, $statusCode = 200) {
        http_response_code($statusCode);
        header('Content-Type: application/json');
        echo json_encode($data);
    }
    protected function redirect($url) {
        header("Location: {$url}");
        exit;
    }
}

用户控制器

<?php
// src/Controllers/UserController.php
namespace App\Controllers;
use App\Models\User;
class UserController extends BaseController {
    public function index() {
        $users = User::all();
        $this->render('users/index', ['users' => $users]);
    }
    public function show($id) {
        $user = User::find($id);
        $this->json($user);
    }
}

用户模型

<?php
// src/Models/User.php
namespace App\Models;
use App\Core\Database;
class User {
    public static function all() {
        $db = Database::getInstance()->getConnection();
        $stmt = $db->query("SELECT * FROM users");
        return $stmt->fetchAll();
    }
    public static function find($id) {
        $db = Database::getInstance()->getConnection();
        $stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
    public static function create($data) {
        $db = Database::getInstance()->getConnection();
        $stmt = $db->prepare(
            "INSERT INTO users (name, email) VALUES (?, ?)"
        );
        return $stmt->execute([$data['name'], $data['email']]);
    }
}

应用初始化

应用类

<?php
// src/Core/Application.php
namespace App\Core;
use App\Controllers\HomeController;
class Application {
    private $router;
    public function __construct() {
        $this->router = new Router();
        $this->registerRoutes();
    }
    private function registerRoutes() {
        $this->router->add('GET', '/', [new HomeController(), 'index']);
        $this->router->add('GET', '/users', [new UserController(), 'index']);
    }
    public function run() {
        $method = $_SERVER['REQUEST_METHOD'];
        $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $this->router->dispatch($method, $uri);
    }
}

Composer配置

{
    "name": "my-php-project/app",
    "description": "PHP Application",
    "type": "project",
    "require": {
        "php": ">=8.0",
        "vlucas/phpdotenv": "^5.5"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "scripts": {
        "start": "php -S localhost:8000 -t public"
    }
}

数据库配置

配置文件

<?php
// config/database.php
return [
    'host' => $_ENV['DB_HOST'] ?? 'localhost',
    'dbname' => $_ENV['DB_NAME'] ?? 'my_db',
    'username' => $_ENV['DB_USER'] ?? 'root',
    'password' => $_ENV['DB_PASS'] ?? '',
    'charset' => 'utf8mb4'
];

环境变量文件

# .env
DB_HOST=localhost
DB_NAME=my_project
DB_USER=root
DB_PASS=secret
APP_ENV=development
APP_DEBUG=true

视图模板

布局文件

<!-- src/Views/layouts/main.php -->
<!DOCTYPE html>
<html>
<head><?= $title ?? 'My App' ?></title>
    <link rel="stylesheet" href="/css/style.css">
</head>
<body>
    <header>
        <nav>
            <a href="/">Home</a>
            <a href="/users">Users</a>
        </nav>
    </header>
    <main>
        <?= $content ?>
    </main>
    <footer>
        <p>&copy; 2024 My App</p>
    </footer>
</body>
</html>

用户列表视图

<!-- src/Views/users/index.php -->
<?php $title = 'Users List'; ?>
<?php ob_start(); ?>
<h1>Users</h1>
<ul>
    <?php foreach ($users as $user): ?>
        <li><?= htmlspecialchars($user['name']) ?> 
            (<?= htmlspecialchars($user['email']) ?>)</li>
    <?php endforeach; ?>
</ul>
<?php $content = ob_get_clean(); ?>
<?php require ROOT_PATH . '/src/Views/layouts/main.php'; ?>

初始化项目

创建项目

# 创建项目目录
mkdir my-php-project
cd my-php-project
# 初始化Composer
composer init
# 安装依赖
composer install
# 创建必要目录
mkdir -p public src/{Controllers,Models,Views,Core} config logs
# 复制入口文件
cp vendor/autoload.php public/
# 创建数据库(MySQL)
mysql -u root -p
CREATE DATABASE my_project;

运行项目

# 使用PHP内置服务器
cd public
php -S localhost:8000
# 或使用Composer脚本
composer start
# 访问
http://localhost:8000

最佳实践建议

  1. 版本控制:使用Git管理代码
  2. 错误处理:实现全局异常处理
  3. 安全性:使用参数绑定防止SQL注入
  4. 日志记录:实现日志系统
  5. 测试:编写单元测试
  6. 代码规范:遵循PSR标准
  7. 缓存机制:实现数据缓存
  8. 性能优化:使用OPcache等

这个基础框架可以帮助你快速开始PHP项目开发,根据需求,你可以逐步添加更多功能,如中间件、ORM、验证器、事件系统等。

抱歉,评论功能暂时关闭!