PHP 怎么代码共进

wen PHP项目 1

本文目录导读:

PHP 怎么代码共进

  1. 传统方式:include/require
  2. 面向对象方式:命名空间和自动加载
  3. 使用Composer管理依赖
  4. Git子模块/子树
  5. 微服务/RPC服务
  6. 实战示例:构建共享代码库
  7. 最佳实践建议
  8. 自动化共享方案
  9. 选择建议

我来详细介绍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/微服务

推荐组合

  1. 使用 Composer 管理依赖
  2. 采用 PSR-4 自动加载规范
  3. 将共享代码放在独立 Git仓库
  4. 使用 CI/CD 自动化构建和测试
  5. 为共享代码编写良好的文档和测试

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