当前位置:首页 > PHP

php实现委托

2026-01-29 21:00:21PHP

委托模式简介

委托模式是一种对象设计模式,允许一个对象将部分功能交给另一个对象处理。在PHP中可通过接口或魔术方法实现类似功能,常用于事件处理、中间件等场景。

通过接口实现委托

定义接口规范委托对象必须实现的方法,主类持有委托对象引用并调用其方法:

interface TaskDelegate {
    public function executeTask(string $data): string;
}

class DelegateImplementation implements TaskDelegate {
    public function executeTask(string $data): string {
        return "Processed: " . strtoupper($data);
    }
}

class MainClass {
    private $delegate;

    public function __construct(TaskDelegate $delegate) {
        $this->delegate = $delegate;
    }

    public function run(string $input) {
        return $this->delegate->executeTask($input);
    }
}

// 使用示例
$delegate = new DelegateImplementation();
$main = new MainClass($delegate);
echo $main->run("test data"); // 输出: Processed: TEST DATA

使用魔术方法实现动态委托

通过__call魔术方法实现动态方法转发,适合不确定委托对象方法的场景:

class DynamicDelegate {
    public function handleRequest($param) {
        return "Dynamic handling: " . $param;
    }
}

class Delegator {
    private $delegate;

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

    public function __call($method, $args) {
        if (method_exists($this->delegate, $method)) {
            return call_user_func_array(
                [$this->delegate, $method], 
                $args
            );
        }
        throw new BadMethodCallException("Method {$method} not found");
    }
}

// 使用示例
$delegate = new DynamicDelegate();
$proxy = new Delegator($delegate);
echo $proxy->handleRequest('value'); // 输出: Dynamic handling: value

闭包作为委托

PHP的闭包特性可以直接作为可调用委托:

class EventDispatcher {
    private $listeners = [];

    public function addListener(string $event, callable $handler) {
        $this->listeners[$event][] = $handler;
    }

    public function dispatch(string $event, $data = null) {
        foreach ($this->listeners[$event] ?? [] as $handler) {
            $handler($data);
        }
    }
}

// 使用示例
$dispatcher = new EventDispatcher();
$dispatcher->addListener('user.login', function($user) {
    echo "User logged in: {$user}\n";
});
$dispatcher->dispatch('user.login', 'admin'); // 输出: User logged in: admin

委托与DI容器结合

在现代框架中常通过依赖注入容器管理委托关系:

php实现委托

interface LoggerInterface {
    public function log(string $message);
}

class FileLogger implements LoggerInterface {
    public function log(string $message) {
        file_put_contents('app.log', $message.PHP_EOL, FILE_APPEND);
    }
}

class Service {
    private $logger;

    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }

    public function doWork() {
        $this->logger->log('Service executed');
    }
}

// 容器配置示例(伪代码)
$container->set(LoggerInterface::class, FileLogger::class);
$service = $container->get(Service::class);
$service->doWork(); // 委托FileLogger记录日志

注意事项

  • 接口委托需明确定义契约,适合长期稳定的协作关系
  • 魔术方法委托更灵活但会牺牲IDE自动补全和类型安全
  • 闭包适合一次性简单逻辑,但难以复用和测试
  • 委托链不宜过长,避免出现"中间人"代码异味

标签: php
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…