当前位置:首页 > 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实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php数据库实现

php数据库实现

PHP 连接 MySQL 数据库 使用 mysqli 扩展连接 MySQL 数据库: <?php $servername = "localhost"; $username = "usernam…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…