search
HomeBackend DevelopmentPHP Tutorial(Transfer) One of Yii's component mechanisms: Analysis of component base class CComponent_PHP tutorial

Yii’s component mechanism

component mechanism is the ideological essence of the entire system of Yii. Before using Yii, you should first understand its component mechanism. If you don’t understand this mechanism, then read YiiThe source code will be very laborious. The component mechanism gives infinite flexibility and scalability to the Yii framework. It is no exaggeration to say that the basic structure of the Yii framework is components. As large as CApplication objects, controllers, route managers (urlManager), as small as some other plug-ins, they all exist in the form of components.

What is the Yii component?

Almost all classes in

Yii that can be instantiated and inherit from CComponent can be called components.

What are the characteristics of components?

inherits from the CComponent class (direct inheritance or indirect inheritance), has event and behavior mechanisms, and can define its various properties in the configuration file.

How to create a component?

Write a custom class and inherit it from the CComponent class.

The

CComponent class is the base class for all components. This class is crucial in the Yii framework. Specifically, this class mainly implements the following three major functions:

1. Use the magic methods __set, __get of php to define the attributes of the class. That is to say, in addition to using the defined public member attributes, the attributes of a component can also take advantage of the functions implemented by CComponent and extend them by extending the setXXX, getXXX methods. Setting and obtaining attributes. For some special attributes, we may want to verify that the format is correct when setting it, which is more useful at this time.
class webpage extends CComponent {

public $title;

private $_url;

public function setUrl($value='') {

if(is_url($value)){

$this->_url = $value;

}

}

public function getUrl() {

return $this->_url ;

}

}

$page = new webpage();

$page->title = "page title";

$page->url = "/index.php"; # call $page->seturl("/index.php");

echo $page->url #$page->geturl();

In other words, if a component defines setXXX, getXXX, then you can use ordinary attribute access forms outside the class.

2. Also use setter, getter to implement event processing interface binding. The event mechanism is also everywhere in Yii. Yii uses a large number of event mechanisms to implement function calls between components (observer pattern).

So, how to define an event for a component? Yii specifies methods in the form of onXX, which are called events, as defined below:
class form extends CComponent {

public function onSubmit($event) {

$this->raiseEvent('onSubmit', $event);

}

}

Using the above fixed code, a onStop event is created for the car component. But what exactly is the use of binding events? The function of binding events is to notify each bound object of its own events through the event handler when the component generates a series of events. For example, we want to notify the log component of this event when the form is submitted and let it record it.

$form = new form();

$form ->attachEventHandler( 'onSubmit', array($logOjbect, "saveLog") );

$form->data = $_POST;

$form->onSubmit( new CEvent($form, array('data'=>$_POST) ) ); #Activate event execution and call event processing interface logObject ::saveLog

The code for logObject may be as follows:
class logObject {

public function saveLog($event) {

$event->sender === $form;

$event->params ;

}

}

Obviously this method is far more flexible and conceptually more advanced than the traditional method of calling.

In addition, you can use the setter method to bind events:

$form->onSubmit = array($logOjbect, "saveLog") ;

Note: The form class does not define the onSubmit member attribute.

At the same time, Yii implements a mechanism for binding multiple processing interfaces to the same event, similar to addEventListener in JavaScript.

The event handler interface Liuya uses the callback type format of php as the standard. For details, please refer to the following content: http://php.net/ manual/en/language.types.callable.php

Such as the code in CLogRouter::init() of Yii:
Yii::app()->attachEventHandler ('onEndRequest',array($this,'processLogs'));

Of course it can also be written as Yii::app()->onEndRequest = array($this,'processLogs');

The onEndRequest event is defined in CApplication:
public function onEndRequest($event){

if(!$this->_ended){

$this->_ended=true;

$this->raiseEvent('onEndRequest',$event);

}

}

It is not enough to define an event and bind a processor to the event. The event must be activated in the appropriate place, such as the logic in the CApplication::run() method:


public function run(){

if($this->hasEventHandler('onBeginRequest'))  

$this->onBeginRequest(new CEvent($this));

$this->processRequest();

if($this->hasEventHandler('onEndRequest'))

$this->onEndRequest(new CEvent($this));

}

In other words, to implement the event mechanism of the component, you need to define events, bind the event processing interface, and activate the event .

Behavior Mechanism

The behavior mechanism of

yii can be simply thought of as a component that directly uses the methods or properties of other objects (just like the traitphp 5.4 🎜>Structure, similar to behavior)

trait SayWorld {

public function sayHello() {

echo 'hello world!';

}

}

class MyHelloWorld extends Base {

use SayWorld;

}

$o = new MyHelloWorld();

$o->sayHello();

Output hello world!

A behavior is a special class that defines various events and their processing procedures. We first define a behavior class that includes events and their corresponding methods.

class MyAppBehavior extends CBehavior {

public $status = "app behavior ended.";

public function events() {

return array(

'onEndRequest' => 'appEnd', #After the specified component's onEndRequest event occurs, call the behavior's appEnd

);

}

 

public function appEnd($event = null) {

echo get_class($this);

}

}

$app->attachBehavior('myapp','MyAppBehavior');

$app->run();

echo $app->status ;

We found that behavioral methods and properties can be used directly by components.

Another common example is that we often need to filter the content input by users, such as preventing them from entering html tags. In this case, we can also consider using a behavioral mechanism to handle it.

$form = new FormModel;

If($_POST) {

$form->attributes = $_POST ;

$form->attachBehavior('myFilter', array(

'class' => '',

'strip_tags' => true ,

));

$form->filter(new CEvent($form) ) ;

}

class myHtmlFilter extends CBehavior {

public $strip_tags = false ;

public function events() {

return array(

'filter' => 'filterHtml',

);

}

public function filterHtml($event) {

if($event->sender instanceof CFormModel) {

$input = $event->sender->attributes ;

$event->sender->attributes = $this->filter($input);

}

}

public function filter(&$data) {

return is_array($data)?array_map(array($this, 'filter'),$data):strip_tags($data);

}

}

Through the above examples, you can find that the behavior method can be run directly as the normal method of the component. What is the use of behavior? I have not fully realized its advantages yet.

(reposted from: http://zhangxugg-163-com.iteye.com/blog/1673325)

Yii’s personal simple understanding
Components: Almost all classes in Yii that can be instantiated and inherit from CComponent can be called components.
Event: class method, for calling between components. It starts with on as an identifier
Behavior: a special class, for components to use directly, similar to trait characteristics

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/815978.htmlTechArticleYii’s component mechanism The component mechanism is the essence of Yii’s entire system. Before using Yii, you should first understand it. Its component mechanism, if you don’t understand this mechanism, then read the Yii source...
Statement
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
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

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

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft