您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
4-2 YII行为之类混合
发布时间:2023-04-29 12:49:44编辑:雪饮阅读()
-
行为类可以被注入到普通类中,使得普通类中可以使用行为类的方法和属性。
而普通类中可以被注入多个行为类,此操作称之为mixin。
行为类中也可以定义一些事件,当普通类触发了行为类的某个事件而去对应行为类执行一些个操作。(这里的操作我个人认为应该是可以是一些异步操作比较好)。
基于此一个简单的行为类如:
D:\phpstudy_pro\WWW\www.xyyii.com\basic\behaviors\Behavior1.php:
<?php
namespace app\Behaviors;
use yii\base\Behavior;
/*
* 行为类1
* 要想一个行为类被注入到其它类中,则该行为类应该继承yii\base\Behavior
* */
class Behavior1 extends Behavior{
//属性-高
public $height;
//方法-吃
public function eat(){
echo "dog eat";
}
//行为类定义事件列表
public function events()
{
return [
/*
* 每个事件对应一个事件名,和触发了该事件应该执行的操作
* 如这里的say事件触发了会执行该行为类中的func_say方法
* */
"say"=>"func_say"
];
}
public function func_say(){
echo "wang wang wang";
}
}
那么行为类中的属性如果不是public修饰的则也是无法被普通类访问或者操作吧。
那么一个不可被普通类访问或者操作吧的第二个行为类如:
D:\phpstudy_pro\WWW\www.xyyii.com\basic\behaviors\Behavior2.php
<?php namespace app\Behaviors; use yii\base\Behavior; /* * 行为类2 * */ class Behavior2 extends Behavior{ /* * 当行为类的属性若是protected修饰,则被注入类就无法访问了 * 则可见这种注入的方式其实内部原理也应该是代替了人手工去new而已, * 实际上肯定也是内部实现里面有new过的 * 当然这个只是我个人理解而已 * */ protected $height2; }那么一个普通类如何被注入,这里一个普通类的示例如:D:\phpstudy_pro\WWW\www.xyyii.com\basic\vendor\animal\Dog.php
<?php namespace vendor\animal; use app\behaviors\Behavior1; use app\behaviors\Behavior2; use yii\base\Component; /* * 自定义的Dog类如果想要被注入成功 * 需要继承yii\base\Component并且定义一个方法behaviors返回继承了yii\base\Behavior的类的列表 * 那么这个列表中每个类就是相当于对该Dog类的一个注入 * * 这被称为注入,我暂且这样认为吧,我总感觉哪里怪怪的 * */ class Dog extends Component { public function behaviors(){ return [ Behavior1::className(), Behavior2::className() ]; } public function look(){ echo 'i am looking!'; } }那么最终控制器调用如:D:\phpstudy_pro\WWW\www.xyyii.com\basic\controllers\HelloController.php:
<?php namespace app\controllers; use vendor\animal\Dog; use yii\web\Controller; class HelloController extends Controller{ public $layout='common'; public function actionIndex(){ $dog=new Dog(); //执行被注入类Dog本身具有的方法look $dog->look(); echo "<hr/>"; //执行被注入类Dog本身不具有但在注入给其的类列表中的app\behaviors\Behavior1类中的方法eat $dog->eat(); echo "<hr/>"; //同理除了访问所用的注入类的方法,也可以操作所注入类的属性(这里则是访问或赋值app\behaviors\Behavior1的height属性) $dog->height="15cm"; echo $dog->height; echo "<hr/>"; //触发行为类app\behaviors\Behavior1的say事件 $dog->trigger("say"); } public function actionIndex2(){ $dog=new Dog(); //访问注入到Dog类中的app\behaviors\Behavior2类中的protected修饰的属性height2 $dog->height2="15cm"; echo $dog->height2; } }
关键字词:类,行为