


Explanation of the definition and binding method of behavior in PHP's Yii framework, yii framework_PHP tutorial
Jul 12, 2016 am 08:56 AMExplanation of the definition and binding method of behavior in PHP's Yii framework, yii framework
Definition of behavior
To define behavior, create a class by inheriting yiibaseBehavior or its subclasses. Such as:
namespace app\components; use yii\base\Behavior; class MyBehavior extends Behavior { public $prop1; private $_prop2; public function getProp2() { return $this->_prop2; } public function setProp2($value) { $this->_prop2 = $value; } public function foo() { // ... } }
The above code defines the behavior class appcomponentsMyBehavior and provides two properties prop1, prop2 and a method foo() for the component to which the behavior is to be attached. Note that the property prop2 is defined through the getter getProp2() and the setter setProp2(). It can be used in this way because yiibaseObject is the ancestor class of yiibaseBehavior. This ancestor class supports defining properties using getter and setter methods
Tip: Inside the behavior, you can access the component to which the behavior has been attached through the yiibaseBehavior::owner attribute.
Static method binding behavior
To bind behaviors statically, you only need to overload yiibaseComponent::behaviors(). This method is used to describe the behavior of the class. How to describe it? Use configuration to describe, which can be the Behavior class name or the configuration array of the Behavior class:
namespace app\models; use yii\db\ActiveRecord; use app\Components\MyBehavior; class User extends ActiveRecord { public function behaviors() { return [ // 匿名的行為,僅直接給出行為的類名稱 MyBehavior::className(), // 名為myBehavior2的行為,也是僅給出行為的類名稱 'myBehavior2' => MyBehavior::className(), // 匿名行為,給出了MyBehavior類的配置數(shù)組 [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ], // 名為myBehavior4的行為,也是給出了MyBehavior類的配置數(shù)組 'myBehavior4' => [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ] ]; } }
There is also a static binding method, which is to bind through the configuration file:
[ 'as myBehavior2' => MyBehavior::className(), 'as myBehavior3' => [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ], ]
Dynamic method binding behavior
Dynamic binding behavior needs to call yiibaseComponent::attachBehaviors():
$Component->attachBehaviors([ 'myBehavior1' => new MyBehavior, // 這是一個命名行為 MyBehavior::className(), // 這是一個匿名行為 ]);
This method accepts an array parameter, and the meaning of the parameter is the same as the static binding behavior above.
In the above examples, the key of the array is used as the name of the behavior, and the behavior that does not provide a key name is an anonymous behavior.
For named behaviors, you can call yiibaseComponent::getBehavior() to get the bound behavior:
$behavior = $Component->getBehavior('myBehavior2');
For anonymous actions, there is no way to directly quote them. However, you can get all the bound behaviors:
$behaviors = $Component->getBehaviors();
Internal principles of binding
Just overloading a yiibaseComponent::behaviors() can you use behaviors so magically? This is just the tip of the iceberg. It is actually related to the binding process. The relevant aspects are:
yii\base\Component::behaviors() yii\base\Component::ensureBehaviors() yii\base\Component::attachBehaviorInternal() yii\base\Behavior::attach()
Behavior only accounts for one of the four methods, and more code is completed in Component.
yiibaseComponent::behaviors() As mentioned above when talking about static method binding behavior, it returns an array to describe the behavior. What about yiibaseComponent::ensuerBehaviors()?
This method will call __get() __set() __isset() __unset() __call() canGetProperty() hasMethod() hasEventHandlers() on() off() etc. when used in many places in the Component. See this Is it a headache? It's not complicated at all. In a word, this function will be called as long as it involves the attributes, methods, and events of the class.
Who are the ensureBehaviors() that are needed by so many mortals? As the name suggests, his role is to "ensure". In fact, it is just to ensure that the behaviors described in behaviors() have been bound:
public function ensureBehaviors() { // 為null表示尚未綁定 // 多說一句,為空數(shù)組表示沒有綁定任何行為 if ($this->_behaviors === null) { $this->_behaviors = []; // 遍歷 $this->behaviors() 返回的數(shù)組,并綁定 foreach ($this->behaviors() as $name => $behavior) { $this->attachBehaviorInternal($name, $behavior); } } }
This method is mainly used for subclasses. yiibaseComponent does not have any pre-injection behavior, so this call is useless. But for subclasses, you may overload yiibaseComponent::behaviros() to pre-inject some behavior. Then, this function will inject these behaviors first.
From the above code, you can naturally see the third thing to talk about next, yiibaseComponentattachBehaviorInternal():
private function attachBehaviorInternal($name, $behavior) { // 不是 Behavior 實例,說是只是類名、配置數(shù)組,那么就創(chuàng)建出來吧 if (!($behavior instanceof Behavior)) { $behavior = Yii::createObject($behavior); } // 匿名行為 if (is_int($name)) { $behavior->attach($this); $this->_behaviors[] = $behavior; // 命名行為 } else { // 已經(jīng)有一個同名的行為,要先解除,再將新的行為綁定上去。 if (isset($this->_behaviors[$name])) { $this->_behaviors[$name]->detach(); } $behavior->attach($this); $this->_behaviors[$name] = $behavior; } return $behavior; }
The first thing to note is that this is a private member. In fact, in Yii, all methods with the suffix *Internal are private. This method does the following things:
If the $behavior parameter is not a Behavior instance, use it as a parameter and use Yii::createObject() to create it.
If you bind a behavior as an anonymous behavior, attach the behavior directly to this class.
If it is a named behavior, first check if there is a behavior with the same name already bound to this class. If so, replace the previous behavior with the later behavior.
In yiibaseComponent::attachBehaviorInternal(), yiibaseBehavior::attach() is called with $this as the parameter. Thus, the last thing related to binding is introduced, yiibaseBehavior::attach(), which is what we didn’t finish talking about when we talked about the elements of behavior earlier. Let’s take a look at the code first:
public function attach($owner) { $this->owner = $owner; foreach ($this->events() as $event => $handler) { $owner->on($event, is_string($handler) ? [$this, $handler] : $handler); } }
The above code does two things:
- Set the $owner of the behavior so that the behavior can access and operate the objects it is attached to
- Traverse the array returned by events() in the behavior, and bind the events to be responded to to the class through on() of the attached class
Summary
Having said so much, let me make a summary about binding:
- The bound action is initiated from Component;
- Static binding is implemented by overloading yiibaseComponent::behaviors();
- Dynamic binding is implemented by calling yiibaseComponent::attachBehaviors();
- Behavior can also be bound by configuring the as configuration item for Component;
- Behaviors can be divided into anonymous behaviors and named behaviors. The difference lies in whether a name is given when binding. Named behaviors can be identified by their names, so that operations such as release can be performed in a targeted manner;
- During the binding process, the later-bound behavior will replace the already-bound behavior of the same name;
- The meaning of binding has two points. One is to set $owner for the behavior. The second is to bind the handler of the event to be responded to in the behavior to the class.
Articles you may be interested in:
- How to remove behaviors bound to components in PHP's Yii framework
- Detailed explanation of using behaviors in PHP's Yii framework Methods
- In-depth explanation of the properties (Property) in PHP's Yii framework
- Example tutorials on using database configuration and SQL operations in PHP's Yii framework
- In-depth analysis of PHP's Yii framework The event mechanism in the Yii framework
- Comprehensive interpretation of the logging function in the Yii framework of PHP
- Yii uses find findAll to find out the implementation method of the specified field
- Parsing the yii database Addition, deletion, check and modification
- Yii PHP Framework practical introductory tutorial (detailed introduction)
- Detailed explanation of attribute injection and method injection of component behavior in PHP's Yii framework

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

TosettherighttimezoneinPHP,usedate_default_timezone_set()functionatthestartofyourscriptwithavalididentifiersuchas'America/New_York'.1.Usedate_default_timezone_set()beforeanydate/timefunctions.2.Alternatively,configurethephp.inifilebysettingdate.timez

The key to writing clean and easy-to-maintain PHP code lies in clear naming, following standards, reasonable structure, making good use of comments and testability. 1. Use clear variables, functions and class names, such as $userData and calculateTotalPrice(); 2. Follow the PSR-12 standard unified code style; 3. Split the code structure according to responsibilities, and organize it using MVC or Laravel-style catalogs; 4. Avoid noodles-style code and split the logic into small functions with a single responsibility; 5. Add comments at key points and write interface documents to clarify parameters, return values ??and exceptions; 6. Improve testability, adopt dependency injection, reduce global state and static methods. These practices improve code quality, collaboration efficiency and post-maintenance ease.

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

PHP page caching improves website performance by reducing server load and speeding up page loading. 1. Basic file cache avoids repeated generation of dynamic content by generating static HTML files and providing services during the validity period; 2. Enable OPcache to compile PHP scripts into bytecode and store them in memory, improving execution efficiency; 3. For dynamic pages with parameters, they should be cached separately according to URL parameters, and avoid cached user-specific content; 4. Lightweight cache libraries such as PHPFastCache can be used to simplify development and support multiple storage drivers. Combining these methods can effectively optimize the caching strategy of PHP projects.

ToquicklytestaPHPcodesnippet,useanonlinePHPsandboxlike3v4l.orgorPHPize.onlineforinstantexecutionwithoutsetup;runcodelocallywithPHPCLIbycreatinga.phpfileandexecutingitviatheterminal;optionallyusephp-rforone-liners;setupalocaldevelopmentenvironmentwith

In PHP, logical operators are used to combine or evaluate conditions, and the main operators include &&, and, ||, or, !, and xor. 1. The difference between && and is in priority. && is higher than the assignment operator, while and is lower than the assignment operator, so the behavior is different when combining assignment; 2.|| and or also have similar priority differences, || takes precedence over assignment, while or is processed after assignment; 3.! operator is used to invert Boolean values, often used to check whether the condition is false, and it is recommended to wrap complex expressions in brackets to ensure correct application; 4.xor returns true only when exactly one of the two values ??is true, suitable for mutex condition judgment
