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示例)

