PHP代码片段管理与复用模式

代码复用是软件工程的核心。PHP提供了多种代码复用方式。今天说说各种代码复用模式的优缺点。

函数复用。

```php
// 函数是最基本的复用形式
function formatDate(string $format = 'Y-m-d'): string
{
return (new DateTime())->format($format);
}

function generateToken(int $length = 32): string
{
return bin2hex(random_bytes($length / 2));
}

function isEmail(string $value): bool
{
return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
}

echo formatDate() . "\n";
echo generateToken(16) . "\n";
echo isEmail('test@test.com') ? '是' : '否' . "\n";
?>

类继承复用。

```php
abstract class BaseRepository
{
protected PDO $pdo;

public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}

public function find(int $id): ?array
{
$stmt = $this->pdo->prepare("SELECT * FROM {$this->getTable()} WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch() ?: null;
}

public function findAll(): array
{
return $this->pdo->query("SELECT * FROM {$this->getTable()}")->fetchAll();
}

abstract protected function getTable(): string;
}

class UserRepository extends BaseRepository
{
protected function getTable(): string
{
return 'users';
}
}

class OrderRepository extends BaseRepository
{
protected function getTable(): string
{
return 'orders';
}
}
?>

Trait复用。

```php
trait Loggable
{
protected function log(string $message): void
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1];
$log = sprintf(
"[%s] %s::%s: %s\n",
date('Y-m-d H:i:s'),
$trace['class'] ?? 'unknown',
$trace['function'] ?? 'unknown',
$message
);
file_put_contents('/tmp/app.log', $log, FILE_APPEND);
}
}

trait Cacheable
{
private array $cache = [];

protected function cacheGet(string $key): mixed
{
return $this->cache[$key] ?? null;
}

protected function cacheSet(string $key, mixed $value): void
{
$this->cache[$key] = $value;
}
}

class UserService
{
use Loggable, Cacheable;

public function getUser(int $id): ?array
{
$cached = $this->cacheGet("user:{$id}");
if ($cached) {
$this->log("从缓存获取用户: {$id}");
return $cached;
}

$user = $this->findUser($id);
$this->cacheSet("user:{$id}", $user);
$this->log("从数据库查询用户: {$id}");
return $user;
}

private function findUser(int $id): array
{
return ['id' => $id, 'name' => '张三'];
}
}

$service = new UserService();
$service->getUser(1);
$service->getUser(1);
?>

接口复用。

```php
interface Exportable
{
public function toArray(): array;
public function toJson(): string;
public function toCsv(): string;
}

class Product implements Exportable
{
public function __construct(
public string $name,
public float $price,
public int $stock
) {}

public function toArray(): array
{
return ['name' => $this->name, 'price' => $this->price, 'stock' => $this->stock];
}

public function toJson(): string
{
return json_encode($this->toArray(), JSON_UNESCAPED_UNICODE);
}

public function toCsv(): string
{
return implode(',', $this->toArray());
}
}
?>

PHP的代码复用方式各有优劣。函数适合无状态工具操作,类继承适合is-a关系,Trait适合水平切分功能,接口定义契约。选择合适的复用方式可以让代码更简洁、更易维护。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐