您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
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;
}
}
关键字词:类,行为