本文目录导读:

我来详细说明如何从零开始搭建一个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>© 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
最佳实践建议
- 版本控制:使用Git管理代码
- 错误处理:实现全局异常处理
- 安全性:使用参数绑定防止SQL注入
- 日志记录:实现日志系统
- 测试:编写单元测试
- 代码规范:遵循PSR标准
- 缓存机制:实现数据缓存
- 性能优化:使用OPcache等
这个基础框架可以帮助你快速开始PHP项目开发,根据需求,你可以逐步添加更多功能,如中间件、ORM、验证器、事件系统等。