本文目录导读:

我来详细介绍PHP代码共享(Code Sharing)的几种方式:
传统方式:include/require
基础用法
// 公共函数文件 functions.php
<?php
function getUserById($id) {
return ['id' => $id, 'name' => '用户'];
}
function formatDate($date) {
return date('Y-m-d', strtotime($date));
}
?>
// 使用文件 file.php
<?php
require_once 'functions.php'; // 或 include_once
require_once 'config.php'; // 配置文件
$user = getUserById(1);
echo $user['name'];
include vs require 区别
include 'file.php'; // 文件不存在警告,继续执行 require 'file.php'; // 文件不存在致命错误,停止执行 include_once 'file.php'; // 只加载一次 require_once 'file.php'; // 只加载一次
面向对象方式:命名空间和自动加载
创建共享类
// src/Logger.php
<?php
namespace App\Utils;
class Logger {
public function log($message) {
echo "[" . date('Y-m-d H:i:s') . "] " . $message . "\n";
}
}
PSR-4自动加载
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
// index.php
<?php
require_once 'vendor/autoload.php';
use App\Utils\Logger;
$logger = new Logger();
$logger->log('系统启动');
使用Composer管理依赖
创建自己的包
project/
├── composer.json
├── src/
│ ├── Service/
│ │ └── UserService.php
│ └── Utils/
│ └── Helper.php
└── tests/
{
"name": "mycompany/my-utils",
"description": "公共工具类",
"require": {
"php": ">=7.4"
},
"autoload": {
"psr-4": {
"MyCompany\\Utils\\": "src/"
}
}
}
在其他项目中使用
{
"require": {
"mycompany/my-utils": "^1.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/mycompany/my-utils.git"
}
]
}
Git子模块/子树
Git Submodule
# 添加子模块 git submodule add https://github.com/company/common-lib.git libs/common # 更新子模块 git submodule update --init --recursive # 拉取最新代码 git submodule foreach git pull origin master
Git Subtree(推荐)
# 添加子树 git subtree add --prefix=libs/common https://github.com/company/common-lib.git main --squash # 更新子树 git subtree pull --prefix=libs/common https://github.com/company/common-lib.git main --squash # 推送回源仓库 git subtree push --prefix=libs/common https://github.com/company/common-lib.git main
微服务/RPC服务
RESTful API共享
// 公共服务端
<?php
// api/user.php
header('Content-Type: application/json');
$users = [
1 => ['name' => '张三', 'email' => 'zhang@example.com'],
2 => ['name' => '李四', 'email' => 'li@example.com']
];
$id = $_GET['id'] ?? 0;
echo json_encode($users[$id] ?? ['error' => 'User not found']);
// 客户端调用
<?php
function getUserApi($id) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.example.com/user.php?id={$id}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
$user = getUserApi(1);
实战示例:构建共享代码库
创建共享包结构
common-library/
├── composer.json
├── src/
│ ├── Config/
│ ├── Models/
│ ├── Services/
│ └── Traits/
├── tests/
├── README.md
└── LICENSE
使用示例
// composer.json (项目使用)
{
"repositories": [
{
"type": "path",
"url": "../common-library"
}
],
"require": {
"mycompany/common": "dev-main"
}
}
实际项目结构
myproject/
├── app/
│ ├── Controllers/
│ └── Models/
├── libs/
│ └── common/ # 共享代码库
├── vendor/ # Composer依赖
├── public/
└── tests/
最佳实践建议
代码共享规范
// 1. 使用接口定义契约
interface UserServiceInterface {
public function getUser(int $id): ?array;
public function createUser(array $data): bool;
}
// 2. 使用Traits共享通用方法
trait ApiResponseTrait {
protected function success($data, $message = '') {
return [
'code' => 200,
'message' => $message,
'data' => $data
];
}
protected function error($message, $code = 400) {
return [
'code' => $code,
'message' => $message
];
}
}
// 3. 抽象类定义通用功能
abstract class BaseService {
protected $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
protected function log($message) {
$this->logger->log(get_class($this) . ': ' . $message);
}
}
自动化共享方案
CI/CD自动集成
# .gitlab-ci.yml
stages:
- build
- test
- deploy
build:
stage: build
script:
- composer install
- composer build
test:
stage: test
script:
- phpunit
deploy:
stage: deploy
script:
- rsync -avz --delete public/ user@server:/var/www/html/
选择建议
| 场景 | 推荐方案 |
|---|---|
| 小型项目 | include/require |
| 中型项目 | Composer + PSR-4 |
| 多项目共享 | Git Subtree + Composer |
| 团队协作 | Git + Composer + CI/CD |
| 跨语言/远程 | REST API/微服务 |
推荐组合:
- 使用 Composer 管理依赖
- 采用 PSR-4 自动加载规范
- 将共享代码放在独立 Git仓库
- 使用 CI/CD 自动化构建和测试
- 为共享代码编写良好的文档和测试