Maison php教程 php手册 简要剖析PHP的Yii框架的组件化机制的基本知识

简要剖析PHP的Yii框架的组件化机制的基本知识

Jun 06, 2016 pm 07:32 PM
php yii 剖析 基本知识 机制 框架 组件

组件是 Yii 应用的主要基石。是 yii\base\Component 类或其子类的实例。三个用以区分它和其它类的主要功能有: 属性(Property) 事件(Event) 行为(Behavior) 或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用。以小部件 yii\jui\D

组件是 Yii 应用的主要基石。是 yii\base\Component 类或其子类的实例。三个用以区分它和其它类的主要功能有:

  • 属性(Property)
  • 事件(Event)
  • 行为(Behavior)

或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用。以小部件 yii\jui\DatePicker 来举例,这是个方便你在 视图中生成一个交互式日期选择器的 UI 组件:

use yii\jui\DatePicker;

echo DatePicker::widget([
  'language' => 'zh-CN',
  'name' => 'country',
  'clientOptions' => [
    'dateFormat' => 'yy-mm-dd',
  ],
]);

Copier après la connexion

这个小部件继承自 yii\base\Component,它的各项属性改写起来会很容易。

正是因为组件功能的强大,他们比常规的对象(Object)稍微重量级一点,因为他们要使用额外的内存和 CPU 时间来处理 事件 和 行为 。如果你不需要这两项功能,可以继承 yii\base\Object 而不是 yii\base\Component。这样组件可以像普通 PHP 对象一样高效,同时还支持属性(Property)功能。

当继承 yii\base\Component 或 yii\base\Object 时,推荐你使用如下的编码风格:

若你需要重写构造方法(Constructor),传入 $config 作为构造器方法最后一个参数,然后把它传递给父类的构造方法。
永远在你重写的构造方法结尾处调用一下父类的构造方法。
如果你重写了 yii\base\Object::init() 方法,请确保你在 init 方法的开头处调用了父类的 init 方法。
例子如下:

namespace yii\components\MyClass;

use yii\base\Object;

class MyClass extends Object
{
  public $prop1;
  public $prop2;

  public function __construct($param1, $param2, $config = [])
  {
    // ... 配置生效前的初始化过程

    parent::__construct($config);
  }

  public function init()
  {
    parent::init();

    // ... 配置生效后的初始化过程
  }
}

Copier après la connexion

另外,为了让组件可以在创建实例时能被正确配置,请遵照以下操作流程:

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// 方法二:
$component = \Yii::createObject([
  'class' => MyClass::className(),
  'prop1' => 3,
  'prop2' => 4,
], [1, 2]);
Copier après la connexion

补充:尽管调用 Yii::createObject() 的方法看起来更加复杂,但这主要因为它更加灵活强大,它是基于依赖注入容器实现的。
yii\base\Object 类执行时的生命周期如下:

构造方法内的预初始化过程。你可以在这儿给各属性设置缺省值。
通过 $config 配置对象。配置的过程可能会覆盖掉先前在构造方法内设置的默认值。
在 yii\base\Object::init() 方法内进行初始化后的收尾工作。你可以通过重写此方法,进行一些良品检验,属性的初始化之类的工作。
对象方法调用。
前三步都是在对象的构造方法内发生的。这意味着一旦你获得了一个对象实例,那么它就已经初始化就绪可供使用。

应用程序CWebApplication组件
在说明Yii中各个组件使用方法前,先了解最重要的一个组件CWebApplication。CWebApplication即应用程序对象,它的根类也是CComponent,故它也是一个组件,具有Yii组件的共同特征。
具体来说,CWebApplication组件的主要作用是根据配置文件,加载必要的辅助组件,并在这些组件的帮助下(如urlManager)创建并运行控制器。故也将其称为前端控制器。
我们可以在配置文件中指定CWebApplication组件本身的配置参数,这些参数被设置为其公共成员变量,或是自动调用setter方法设置属性,这个特性可以在CWebApplication的构造函数中发现:$this->configure($config);
如在配置文件protected/config/main.php全局中指定:

'charset' => 'utf-8',
Copier après la connexion

这实际是设置当前应用程序的charset公共属性(在CApplication中声明)而如果在配置文件中指定'language' => 'zh_cn', 我们发现CWebApplication及其所有上级类均未声明$language属性,这时将使用setter模式方法即setlanuage(此方法定义在CApplication类中)。
OK,了解这个特性之后,我们就可以明白在配置文件中可以配置的属性:

  • CWebApplication及其所有上级类的公共成员变量
  • CWebApplication及其所有上级类的setter方法指定的属性当然我们也可以通过继承CWebApplication构造自己的应用程序类。

CWebApplication的继承层次为:CApplication -> CModule -> CComponent, 我们将默认的配置文件中常见的配置项及其生效位置予以说明:

  • basePath : CApplication::setBasePath()
  • name: CApplication::$name
  • preload: CModule::$preload
  • import: CModule::setImport()
  • defaultController: CWebApplication::$defaultController
  • components: CModule::setComponents()

类似地,再列出几个默认配置文件中并未列出的配置项:timezone: CApplication::setTimeZone() #配置时区

再例如,如果我们继承CWebApplication, 扩展自己的应用程序类myApp, 并定义方法setError_reporting(不区分大小写), 那么就可以直接在配置文件中指定error_reporting选项。
辅助组件可以将CWebApplication组件视为一部机器,那么辅助组件就可以视为组成这部机器的各个零件,没有零件的正确组合,机器就无法正常工作,这在Yii中也是同样的概念。而一些组件对整部机器的运转是必须的,这就是核心组件。在应用程序对象构造后,Yii会将辅助组件基本信息进行登记(组件名称与类名,属性配置的对照表),以供后续使用,对web应用程序而言,存在以下核心组件(通过CWebApplication::registerCoreComponents,CApplication::registerCoreComponents注册):

CWebApplication::registerCoreComponents中注册的核心组件

2016317152903914.png (629×145)

CApplication::registerCoreComponents中注册的核心组件

2016317152921101.png (645×160)

配置文本中注册的核心组件:log CLogRouter 日志路由管理器
以上标记为红色的条目,是最重要的辅助组件,其它的核心组件我们未必会使用到。
如何定义辅助组件的属性?通过在配置文件protected/config/main.php中设置components项的值,实现组件属性定义。这里的定义主要是三个要素:指定组件的名称(核心组件已经预先设置)、指定组件使用的类(核心组件无须定义),组件的属性(可选、视情况而定)
如以下配置:

'components' => array(
'db' => array(
'class' => 'myCDbConnection',
'connnectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'user' => 'root',
),
);
Copier après la connexion

就设置了db组件使用的类为myCDbConnection, 并且在后面指定了连接串及账号等信息。提示: myCDbConnection类可能就是通过继承CDbConnection类定义。核心组件无须指定class参数(因为已经预先定义好)
问题:如何得知某个组件可配置的属性?这个问题至关重要,如果我们掌握了规律,就可以举一反三,所有组件的配置均可以灵活设定。授之以鱼不如授之以渔。在本节会说明通用的方法。要得知组件的所有可定义属性,按以下步骤进行:
1. 组件所使用的类是什么?(无论是核心组件还是自定义组件)
2. 组件类的公共成员变量都有哪些?(注意从父类继承而来的公共成员变量)
3. 组件类都有哪些settter方法?(注意从父类继承而来的方法)
明白了以上三个要点,我们就可以按规律定义组件的属性,比如对最重要的db组件,我们发现这是一个核心组件,使用的类为CDbConnection, 我们查阅这个类的定义文件,发现这个类的公共成员变量有:

$connectionString;

  • $username='';
  • $password='';
  • $autoConnect=true;
  • $charset;
  • $emulatePrepare;
  • $tablePrefix;
  • $initSQLs;
  • ... ...

setter方法定义的属性:

  • setActive($value)
  • setAttributes($values)
  • setAutoCommit($value)
  • setColumnCase($value)
  • setNullConversion($value)
  • setPersistent($value)

提示:setter方法定义的属性名称不区分大小写以上所列的属性,均可以在配置文件中指定,具体每个属性的作用,请参阅Yii类文件的详细注释(Yii代码的注释也是相当棒,通俗易懂,而又很详细)

再来一个例子,定义urlManager组件的属性这个组件使用的类为CUrlManager, 我们查阅它的属性:

  • $rules=array();
  • $urlSuffix='';
  • $showScriptName=true;
  • $appendParams=true;
  • $routeVar='r';
  • $caseSensitive=true;

通过setter方法定义的属性:

  • setUrlFormat($value)
  • setBaseUrl($value)

即urlManager组件的上述属性可以在配置文件中定义(每项配置的作用请参阅其注释)。其它组件的配置均可按上述方法处理。

如何使用组件应用程序运行后,会将所有已经定义过的组件注册(并未实例化)到CWebApplication对象上,同时CWebApplication应用程序对象会被注册到Yii::$_app,在程序的任何位置均可通过Yii::app()得到当前应用程序对象引用,再通过$app对象得到组件实例引用,如:Yii::app()->getComponent('urlManager'); #会查找组件配置并实例化之Yii::app()->urlManager; #通过CModule::__get()魔术方法实现
如何自定义组件?这是很常见的需求,比如我们可能希望db组件(数据库连接)使用我们自定义的类,也或者我们希望使用多个数据库连接,这种情况下就需要自定义组件,使用多数据库的例子:

components=>array(
'db' => array(
... ...
),
'mydb'=>array(
'class' => 'myDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'tablePrefix' => 'cdb_',
'username' => 'root',
),
),
修改默认的db组件所使用的类:
components=>array(
'db' => array(
'class' => 'myDbConnection',
... ...
),
),
Copier après la connexion

经过本文的分析,我是深切理解了Yii组件化机制给应用程序带来的极大的扩展性,哈哈哈哈~

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles