PHP代码片段管理与复用模式
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适合水平切分功能,接口定义契约。选择合适的复用方式可以让代码更简洁、更易维护。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)