


Explanation of the definition and binding method of behavior in PHP's Yii framework_php skills
Define 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类的配置数组 [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ], // 名为myBehavior4的行为,也是给出了MyBehavior类的配置数组 '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表示尚未绑定 // 多说一句,为空数组表示没有绑定任何行为 if ($this->_behaviors === null) { $this->_behaviors = []; // 遍历 $this->behaviors() 返回的数组,并绑定 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 实例,说是只是类名、配置数组,那么就创建出来吧 if (!($behavior instanceof Behavior)) { $behavior = Yii::createObject($behavior); } // 匿名行为 if (is_int($name)) { $behavior->attach($this); $this->_behaviors[] = $behavior; // 命名行为 } else { // 已经有一个同名的行为,要先解除,再将新的行为绑定上去。 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;
- Binding has two meanings. 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.

TomodifydatainaPHPsession,startthesessionwithsession_start(),thenuse$_SESSIONtoset,modify,orremovevariables.1)Startthesession.2)Setormodifysessionvariablesusing$_SESSION.3)Removevariableswithunset().4)Clearallvariableswithsession_unset().5)Destroythe

Arrays can be stored in PHP sessions. 1. Start the session and use session_start(). 2. Create an array and store it in $_SESSION. 3. Retrieve the array through $_SESSION. 4. Optimize session data to improve performance.

PHP session garbage collection is triggered through a probability mechanism to clean up expired session data. 1) Set the trigger probability and session life cycle in the configuration file; 2) You can use cron tasks to optimize high-load applications; 3) You need to balance the garbage collection frequency and performance to avoid data loss.

Tracking user session activities in PHP is implemented through session management. 1) Use session_start() to start the session. 2) Store and access data through the $_SESSION array. 3) Call session_destroy() to end the session. Session tracking is used for user behavior analysis, security monitoring, and performance optimization.

Using databases to store PHP session data can improve performance and scalability. 1) Configure MySQL to store session data: Set up the session processor in php.ini or PHP code. 2) Implement custom session processor: define open, close, read, write and other functions to interact with the database. 3) Optimization and best practices: Use indexing, caching, data compression and distributed storage to improve performance.

PHPsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIDstoredinacookie.Here'showtomanagethemeffectively:1)Startasessionwithsession_start()andstoredatain$_SESSION.2)RegeneratethesessionIDafterloginwithsession_regenerate_id(true)topreventsessi

In PHP, iterating through session data can be achieved through the following steps: 1. Start the session using session_start(). 2. Iterate through foreach loop through all key-value pairs in the $_SESSION array. 3. When processing complex data structures, use is_array() or is_object() functions and use print_r() to output detailed information. 4. When optimizing traversal, paging can be used to avoid processing large amounts of data at one time. This will help you manage and use PHP session data more efficiently in your actual project.

The session realizes user authentication through the server-side state management mechanism. 1) Session creation and generation of unique IDs, 2) IDs are passed through cookies, 3) Server stores and accesses session data through IDs, 4) User authentication and status management are realized, improving application security and user experience.


Hot AI Tools

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

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

Undress AI Tool
Undress images for free

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

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.
