Table of Contents
Explanation of the definition and binding method of behavior in PHP's Yii framework, yii framework
Articles you may be interested in:
Home Backend Development PHP Tutorial Explanation of the definition and binding method of behavior in PHP's Yii framework, yii framework_PHP tutorial

Explanation of the definition and binding method of behavior in PHP's Yii framework, yii framework_PHP tutorial

Jul 12, 2016 am 08:56 AM
php yii

Explanation 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()
  {
    // ...
  }
}

Copy after login

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',
      ]
    ];
  }
}

Copy after login

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',
  ],
]

Copy after login

Dynamic method binding behavior

Dynamic binding behavior needs to call yiibaseComponent::attachBehaviors():

$Component->attachBehaviors([
  'myBehavior1' => new MyBehavior, // 这是一个命名行为
  MyBehavior::className(),     // 这是一个匿名行为
]);
Copy after login

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');
Copy after login

For anonymous actions, there is no way to directly quote them. However, you can get all the bound behaviors:

$behaviors = $Component->getBehaviors();
Copy after login

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()
Copy after login

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);
    }
  }
}

Copy after login

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;
}

Copy after login

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);
  }
}
Copy after login

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

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1111897.htmlTechArticleExplanation of the definition and binding method of behavior in PHP's Yii framework. To define behavior in the yii framework, you need to define the behavior through inheritance. yiibaseBehavior or its subclass to create a class. For example: namespace a...
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles