Yii ソースコードの解釈 - 属性

WBOY
リリース: 2016-07-29 08:58:15
オリジナル
1142 人が閲覧しました

Yii の基本

Attributes プロパティ

アクセスの観点から見ると、属性はクラスのステータスを表すために使用されます。ただし、メンバー変数はクラスの構造構成に関する概念であり、属性はクラスの機能ロジックに関する概念です

Q: 属性とメンバー変数の違いは何ですか?

  • メンバー変数は、クラスの構造を反映する「内部」概念です。属性は「外部」概念であり、クラスの論理的意味を反映します。

  • メンバー変数には読み取りおよび書き込み権限の制御がありませんが、プロパティは読み取り専用または書き込み専用、または読み取りと書き込みの両方として指定できます。

  • メンバー変数は読み取りのための後処理も書き込みのための前処理も受けませんが、属性は受けます。

  • パブリックメンバー変数は、前処理や後処理なしで読み取りおよび書き込み可能なプロパティとみなすことができます。 プライベートメンバー変数は外部からは見えず、属性の「外部」特性と矛盾するため、属性とみなされません。

  • ほとんどの場合、属性は 1 つ以上のメンバー変数で表されますが、属性とメンバー変数の間には必要な対応関係はありません。たとえば、NAND ゲートの出力属性には、いわゆる $output メンバーがありません。変数はそれに対応します。

yiibaseObject は属性のサポートを提供しますyiibaseObject 提供了对属性的支持

属性的实现

<code>class foo extends yii\base\object{
    private $_title;
    
    public function setTitle($title){
        $this->_title = trim($title);
    }
    
    public function getTitle(){
        return $this->_title;
    }
}</code>
ログイン後にコピー

属性能够对类实现更好的封装,同时构件入口,对成员变量统一管理。

然而__get(), __set()遍历所有成员变量,找不到匹配的成员变量时才被调用。其效率天生地低于使用成员变量的形式。在一些表示数据结构、数据集合等简单情况下,且不需读写控制等, 可以考虑使用成员变量作为属性,这样可以提高一点效率。

自动调用 __get() __set() 的时机仅仅发生在访问不存在的成员变量时。 因此,如果定义了成员变量 public $title 那么,就算定义了 getTitle() setTitle() , 他们也不会被调用。因为 $post->title 时,会直接指向该 public $title。

PHP对于类方法不区分大小写,即大小写不敏感,对属性名也是不区分大小写的。

__get() __set() 都是public的,static的方法统统不好使。

Component

Yii自称是基于组建的框架。

yiibaseComponent继承自yiibaseObject,Component重载了Object中的属性方法,同时也加入了事件和行为。

由于重载加入了事件和行为,Component的性能会笔Object差一点。

Object的配置

Yii的对象配置方法是统一的。所有对象的配置都是通过Object中的__construct()来配置。配置的本质就在Yii::configure()中,他通过配置数组,构建属性。

Q: 如果配置是多维的数组怎么办呢?

Yii在yiidiServiceLocator中实现了对这一数组的具体处理: setComponents

Summary

通过yiibaseObject::__construct(),我们可以看到,所有对象,包括Component的属性的加载,均有4个阶段,(前三个阶段是一气呵成在一起的)。

  1. 预初始化:默认定义Property

  2. Yii::configure()来加载配置数组,覆盖Property

  3. 后初始化:init()

    属性の実装
  4. rrreee
  5. 属性は、コンポーネントのエントリと統合メンバー変数が管理しながら、クラスのカプセル化をより適切に実現できます。

    ただし、__get()__set() はすべてのメンバー変数を走査し、一致するメンバー変数が見つからない場合にのみ呼び出されます。その効率は本質的にメンバー変数を使用するよりも低くなります。データ構造、データ コレクションなどが表現され、読み取り/書き込み制御が必要ない単純な状況では、効率を向上させるためにメンバー変数を属性として使用することを検討できます。

__get() __set() が自動的に呼び出されるタイミングは、存在しないメンバ変数にアクセスする場合のみ発生します。 したがって、メンバ変数 public $title が定義されている場合、getTitle() setTitle() が定義されていても呼び出されません。 $post->title の場合、パブリック $title を直接指すことになるためです。

  1. PHP はクラス メソッドでは大文字と小文字を区別しません。つまり、大文字と小文字は区別されません。また、属性名でも大文字と小文字が区別されません。

  2. __get() __set() はすべてパブリックであり、static メソッドは使いにくいです。

Component

Yii はコンポーネントベースのフレームワークであると主張しています。

🎜yiibaseComponentyiibaseObject を継承し、Object のプロパティ メソッドをオーバーロードし、イベントと動作も追加します。 🎜🎜🎜オーバーロードによりイベントや動作が追加されるため、コンポーネントのパフォーマンスはオブジェクトのパフォーマンスよりもわずかに低下します。 🎜🎜オブジェクト構成🎜🎜Yii のオブジェクト構成方法は統一されています。すべてのオブジェクトは、Object__construct() を通じて設定されます。設定の本質は Yii::configure() にあり、設定配列を通じてプロパティを構築します。 🎜🎜Q: 構成が多次元配列の場合はどうなりますか? 🎜🎜🎜Yii は、この配列の特定の処理を yiidiServiceLocator: setComponents に実装します。 🎜🎜概要🎜🎜 yiibaseObject::__construct() を通して、コンポーネント属性のロードを含むすべてのオブジェクトには 4 つのステージがあることがわかります (最初の 3 つのステージはまとめられています)一度に)。 🎜🎜🎜🎜事前初期化: デフォルトで Property を定義🎜🎜🎜🎜Yii::configure() して構成配列をロードし、Property🎜🎜🎜🎜 を上書きしてから初期化します: init() 実行🎜🎜🎜🎜クラスメソッド呼び出しフェーズ。 🎜🎜🎜🎜参考🎜🎜🎜🎜http://www.digpage.com/🎜🎜🎜 🎜 上記では、Yii のソースコードの解釈属性を内容の側面も含めて紹介していますが、PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート