Creating Behaviors on Yii Framework
Last updated:Behaviors are a good alternative to subclassing when it comes to sharing functionality among classes.
Yii Behaviors are a very elegant way to reuse functionality on the class level even though PHP itself only added Traits(a very close concept to Yii Behaviors) on version 5.4.
Creating a simple Behavior
p.s.: save this as SomeBehavior.php
under protected/extensions
class SomeBehavior extends CBehavior{
public function sayHello(){
echo "hello";
}
}
Using that Behavior in your class
p.s.: just using an AR model for example's sake; it could be any class at all.
class Person extends CActiveRecord{
public function behaviors(){
return array(
'foo'=>array(
'class'=>'application.extensions.SomeBehavior'
));
}
now, if you ever instantiate your Person
class, you can call method sayHello()
as if it had it!!
$p = new Person();
$p->sayHello();//'hello'
Extra Points: parameterizing (setting attributes to) Behaviors
You can also customize the behavior for each class that's using it. For example, say you have a behavior that you want to add a little flexibility to:
class CommunicateBehavior extends CBehavior{
public $extraPolite=false;
public function askQuestion($question){
if($this->extraPolite){
echo "Excuse me, sir, ".$question." ?";
}else{
echo $question." ?";
}
}
}
Then you can use it differently in each other class, for example:
class Brazilian extends Person{
public function behaviors(){
return array(
'comm'=>array(
'class'=>'path.to.CommunicationBehavior',
));
}
}
or, for an Englishman:
class Englishman extends Person{
public function behaviors(){
return array(
'comm'=>array(
'class'=>'path.to.CommunicationBehavior',
'extraPolite'=>true
));
}
}
and each would ask a question in a different way:
$b = new Brazilian;
$b->askQuestion("what's the time");//what's the time?
but
$e = new Englishman;
$e->askQuestion("what's the time");//excuse me sir, what's the time?
This is really, really beautiful and powerful stuff. Always glad to have chosen Yii as my framework of choice.
w.i.p.: This is a work in progress. More content will hopefully be added for this.