Creating Behaviors on Yii Framework

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 itselfonly 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.

0 comments: