yii2行为的方法如何注入到组件类中详解

发布时间 - 2026-01-11 02:56:24    点击率:

前言

当了解了行为属性的注入逻辑后,方法的注入对于我们来说就很简单了。逻辑一样。只不过此刻我们不再调用 __get 方法,而是一个用于方法的 __call 方法。下面话不多说了,来一起看看详细的介绍:

在研究之前先跟我学习两个PHP的知识:

  • __call
  • call_user_func_array

__call

__call 是 PHP 的一个魔术方法,这个方法和 __get 功能差不多,当发现一个类的方法未定义时会触发此函数,它有两个参数

public mixed __call ( string $name , array $arguments )

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数,举个例子

class User {
 public function __call($name, $arguments) {
   echo "Calling object method '$name' "
     . implode(', ', $arguments). "\n";
 }
}

// do it
$model = new User();
$model->hello("abei2017");// Calling object method 'hello' abei2017

看懂了么,贴个官方文档地址 传送门

call_user_func_array

调用回调函数,并把一个数组参数作为回调函数的参数。先贴个官方文档地址 传送门 ,举个例子再。

class User {
 function Hello($arg) {
  echo __METHOD__, " got $arg\n";
 }
}

$model = new User();
call_user_func_array([$model, "Hello"], ["abei2017"]); // User::Hello got abei2017

OK,在你了解了这两个函数后,我们开始研究行为方法的注入。

方法如何注入

说来蛮简单,就一个方法

// vendor/yiisoft/yii2/base/Component.php
public function __call($name, $params){

 $this->ensureBehaviors();
 foreach ($this->_behaviors as $object) {
  if ($object->hasMethod($name)) {
   return call_user_func_array([$object, $name], $params);
  }
 }
 throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

逻辑很简单

  • 使用 $this->ensureBehaviors(); 函数确保所有行为到位。
  • 遍历组件当前的行为,并判断行为对象此方法是否存在。
  • 如果存在则通过 call_user_func_array 调用此行为的方法

最后达到和组件调用自己的方法一样的效果。

总结

到现在我们知道如何配置行为、行为运行、行为注入原理,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# yii2  # 组件  # 行为  # 注入  # Yii框架学习笔记之应用组件操作示例  # yii2高级应用之自定义组件实现全局使用图片上传功能的方法  # Yii框架组件和事件行为管理详解  # Yii扩展组件编写方法实例分析  # Yii框架响应组件用法实例分析  # Yii框架核心组件类实例详解  # PHP的Yii框架中移除组件所绑定的行为的方法  # Yii框架自定义数据库操作组件示例  # Yii2中组件的注册与创建方法  # Yii框架组件的事件机制原理与用法分析  # Yii框架应用组件用法实例分析  # 很简单  # 回调  # 举个例子  # 自己的  # 是一个  # 传送门  # 文档  # 说了  # 遍历  # 不多  # 跟我  # 这两个  # 这篇文章  # 谢谢大家  # 并把  # 含着  # 前先  # 看懂  # 是否存在  # 只不过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理异常和错误?(Handler示例)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  实例解析angularjs的filter过滤器  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel如何集成Inertia.js与Vue/React?(安装配置)  黑客入侵网站服务器的常见手法有哪些?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何实现文件上传和存储?(本地与S3配置)  JavaScript如何实现错误处理_try...catch如何捕获异常?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何快速选择适合个人网站的云服务器配置?  JS实现鼠标移上去显示图片或微信二维码  JavaScript如何实现音频处理_Web Audio API如何工作?  Android Socket接口实现即时通讯实例代码  如何在IIS中新建站点并配置端口与物理路径?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何在景安云服务器上绑定域名并配置虚拟主机?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何快速搭建高效可靠的建站解决方案?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel如何处理和验证JSON类型的数据库字段  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  教学论文网站制作软件有哪些,写论文用什么软件 ?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  js代码实现下拉菜单【推荐】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何在IIS中新建站点并配置端口与IP地址?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  JavaScript如何实现继承_有哪些常用方法  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel如何配置任务调度?(Cron Job示例)  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Android利用动画实现背景逐渐变暗  如何在Windows服务器上快速搭建网站?  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何自定义分页视图?(Pagination示例)