Yiiのプロパティの詳細な説明
この記事では主に PHP の Yii フレームワークのプロパティ (Property) を紹介し、プロパティを実装する手順を詳しく説明します。必要な友人は参照してください。お役に立てれば幸いです。
PHPでは、クラスのメンバー変数はプロパティとも呼ばれます。これらはクラス定義の一部であり、インスタンスの状態を表すために (つまり、クラスの異なるインスタンスを区別するために) 使用されます。具体的な実践では、属性の読み取りと書き込みに少し特殊なメソッドを使用したいことがよくあります。たとえば、毎回ラベル属性に対してトリム操作を実行する必要がある場合は、次のコードを使用してそれを実現できます:
$object->label = trim($label);
上記のコードの欠点は、ラベル属性が変更されている限り、トリム( ) 関数を再度呼び出す必要があります。将来、最初の文字を大文字にするなど、他の方法でラベル属性を処理する必要がある場合は、ラベル属性に値を割り当てるすべてのコードを変更する必要があります。このコードの重複はバグを引き起こす可能性があるため、この行為は可能な限り避ける必要があることは明らかです。
この問題を解決するために、Yii は yiibaseObject と呼ばれる基本クラスを導入します。これは、クラス内のゲッターおよびセッター (リーダーおよびセッター) メソッドに基づくプロパティの定義をサポートします。クラスがこの機能をサポートする必要がある場合、yiibaseObject またはそのサブクラスを継承するだけで済みます。
補足: Yii フレームワークのほぼすべてのコアクラスは、yiibaseObject またはそのサブクラスを継承します。これは、コア クラスでゲッター メソッドまたはセッター メソッドを見つけたときはいつでも、プロパティと同じように呼び出すことができることを意味します。
ゲッター メソッドは名前が get で始まるメソッドであり、セッター メソッド名は set で始まります。メソッド名の get または set 以降の部分は、プロパティの名前を定義します。以下のコードに示すように、ゲッター メソッド getLabel() とセッター メソッド setLabel() は、ラベル属性を操作します:
namespace app\components; use yii\base\Object; class Foo extend Object { private $_label; public function getLabel() { return $this->_label; } public function setLabel($value) { $this->_label = trim($value); } }
(詳細説明: ゲッター メソッドとセッター メソッドは、label という名前の属性を作成します。この例では、それはポイントです)
ゲッター/セッターで定義されたプロパティは、クラスのメンバー変数と同じように使用されます。 2 つの主な違いは、このプロパティが読み取られると、対応するゲッター メソッドが呼び出され、プロパティに値が割り当てられると、対応するセッター メソッドが呼び出されることです。例:
// 等效于 $label = $object->getLabel(); $label = $object->label; // 等效于 $object->setLabel('abc'); $object->label = 'abc';
ゲッターのみを定義し、セッターを定義しないプロパティは読み取り専用プロパティです。このようなプロパティに割り当てようとすると、yiibaseInvalidCallException (無効な呼び出し) 例外が発生します。同様に、ゲッター メソッドを使用せずにセッター メソッドのみで定義されたプロパティは書き込み専用プロパティであり、そのようなプロパティを読み取ろうとした場合も例外がトリガーされます。書き込み専用プロパティを使用するケースはほとんどありません。
ゲッターとセッターを通じて定義されたプロパティには、いくつかの特別なルールと制限もあります。
そのようなプロパティの名前は、大文字と小文字が区別されません。たとえば、$object->label と $object->Label は同じプロパティです。 PHP メソッド名では大文字と小文字が区別されないためです。
このタイプの属性の名前がクラスのメンバー変数と同じ場合は、後者が優先されます。たとえば、上記の Foo クラスに label メンバー変数があり、$object->label = 'abc' に値を割り当てると、セッター setLabel() メソッドの代わりにメンバー変数に割り当てられるとします。
このタイプのプロパティは、可視性 (アクセス制限) をサポートしていません。プロパティの getter メソッドと setter メソッドが public、protected、または private であるかどうかは、プロパティの可視性には影響しません。
このタイプのプロパティのゲッター メソッドとセッター メソッドは、非静的メソッドとしてのみ定義できます。静的メソッド (静的) として定義されている場合、同じように処理されません。
最初に述べた質問に戻りますが、trim() 関数をどこでも呼び出すのではなく、setter setLabel() メソッド内で 1 回呼び出すだけで済みます。ラベルの最初の文字を大文字にするという新しい要件が発生した場合は、他のコードには触れずに setLabel() メソッドを変更するだけで済みます。
属性を実装する手順
オブジェクトの存在しないメンバー変数を読み書きする場合、__get() __set() が自動的に呼び出されることはわかっています。 Yii はこれを利用して属性のサポートを提供します。上記のコードから、オブジェクトのプロパティにアクセスすると、Yii が getpropertyname() という関数を呼び出すことがわかります。たとえば、SomeObject->Foo は SomeObject->getFoo() を自動的に呼び出します。プロパティが変更されると、対応するセッター関数が呼び出されます。 たとえば、SomeObject->Foo = $someValue は SomeObject->setFoo($someValue) を自動的に呼び出します。
したがって、プロパティを実装するには、通常、次の 3 つの手順があります:
yiibaseObject から継承します。
このプロパティを保存するには、プライベート メンバー変数を宣言します。
上記のプライベート メンバー変数にアクセスして変更するためのゲッター関数またはセッター関数、あるいはその両方を提供します。 ゲッターのみが提供されている場合、プロパティは読み取り専用であり、セッターのみが提供されている場合、プロパティは書き込み専用です。
次の Post クラスは、読み取りおよび書き込み可能な属性 title を実装します:
class Post extends yii\base\Object // 第一步:继承自 yii\base\Object { private $_title; // 第二步:声明一个私有成员变量 public function getTitle() // 第三步:提供getter和setter { return $this->_title; } public function setTitle($value) { $this->_title = trim($value); } }
理論的に言えば、private $_title を public $title として書き込むと、 $post->title の読み取りと書き込みも可能になります。しかし、これは次の理由から良い習慣とは言えません:
クラスのカプセル化が失われました。 一般に、メンバー変数を外部から見えないようにすることは、良いプログラミング方法です。 ここからは表示されないかもしれませんが、いつかユーザーにタイトルを変更させたくない場合、どうすれば変更できますか? タイトルがコード内で直接変更されないようにする方法は? セッターが提供されている場合、そのセッターが削除されている限り、ヘッダーへの未クリーンな書き込みがあると例外がスローされます。 public $titleメソッドを使用している場合、private $titleに変更することで書き込み例外を確認できますが、読み出しも禁止されます。
タイトルを書く場合、スペースを削除したい。 setter メソッドを使用すると、上記のコード スニペットのように、この場所で trim() を呼び出すだけで済みます。 ただし、パブリック $title メソッドを使用する場合は、write ステートメントごとにtrim() が呼び出されるのは間違いありません。 何も欠けていないことを保証できますか?
そのため、 public $title を使うのは手っ取り早いだけで簡単そうに見えますが、今後の修正が面倒になります。 それは悪夢と言ってもいい。これがソフトウェア エンジニアリングの意味であり、特定の方法でコードの保守と変更を容易にします。 一見不必要に思えるかもしれませんが、実際、損失を被った友人や、クライアントの上司から前のプログラマーが書いたコードの修正を強要され、親戚に挨拶した友人は皆、これが非常に必要だと感じるでしょう。
しかし、この世に絶対はありません。 __get() と __set() はすべてのメンバー変数を調べられるため、一致するメンバー変数が見つからない場合にのみ呼び出されます。 したがって、その効率はメンバー変数を使用する場合よりも本質的に低くなります。データ構造、データ コレクションなどが表現され、読み取り/書き込み制御が必要ない単純な状況では、メンバー変数を属性とみなすことができるため、効率が向上します。
効率を向上させるもう 1 つの小さなトリックは、$pro = $object->pro の代わりに $pro = $object->getPro() を使用し、$object -> の代わりに $objcect->setPro($value) を使用することです。 ;pro = $value 。 これは機能的にはまったく同じですが、__get() と __set() の使用を回避します。これは、トラバーサル プロセスをバイパスするのと同じです。
ここで誰かが私を叱るべきだと思いますが、Yii は開発者の便宜のために属性メカニズムを最終的に実装しましたが、いわゆる効率を向上させるために独自の方法を使用する方法を教えるためにここにいます。 確かに、開発の利便性と実行の高効率の間には、ある種の矛盾があります。私の個人的な考え方としては、利便性を第一に考え、Yii が作り出した便利な条件を有効に活用したいと考えています。効率に関しては、フレームワーク自体がもっと注意を払う必要がありますが、余分なコードを書かない限りは問題ありません。
しかし、Yii のフレームワークでは $app->request のようなコードはめったに出現せず、代わりに $app->getRequest() が使用されるのでご安心ください。 つまり、フレームワーク自体は効率性を重視しており、利便性は開発者に委ねられています。 つまり、ここで紹介するのは単なる知識であり、それを使用するかどうか、どのように使用するかは完全にあなた次第です。
注意点:
__get() __set() を自動的に呼び出すタイミングは、存在しないメンバー変数にアクセスする場合にのみ発生するためです。 したがって、メンバ変数 public $title が定義されている場合、getTitle() setTitle() が定義されていても呼び出されません。 $post->title は直接 $title を指すため、 __get() __set() は呼び出されません。根元から切り離されてしまいました。
PHP はクラス メソッドの大文字と小文字を区別しないため、$post->getTitle() と $post->gettitle() は同じ関数を呼び出します。 したがって、$post->title と $post->Title は同じプロパティです。つまり、属性名でも大文字と小文字は区別されません。
__get() __set() は両方とも public であるため、getTitle() setTitle() が public、private、または protected として宣言されているかどうかは意味がありません。また、外部からアクセスすることもできます。したがって、すべてのプロパティは公開されます。
__get() も __set() も静的ではないため、静的属性を使用する方法はありません。
Object のその他の属性関連メソッド
__get() __set() に加えて、yiibaseObject は属性の使用を容易にする次のメソッドも提供します:
__isset() は属性値が正しいかどうかをテストするために使用されます。 isset($object->property) の null が自動的に呼び出されます。 このプロパティには対応するゲッターが必要であることに注意してください。
__unset() はプロパティ値を null に設定するために使用され、unset($object->property) のときに自動的に呼び出されます。 このプロパティには対応するセッターが必要であることに注意してください。
hasProperty() は、特定のプロパティが存在するかどうかをテストするために使用されます。つまり、ゲッターまたはセッターが定義されます。 hasProperty() のパラメータ $checkVars = true (デフォルトは true) の場合、前述の public $title など、同じ名前のメンバー変数もこのプロパティを持つとみなされます。
canGetProperty() は、プロパティが読み取り可能かどうかをテストします。パラメーター $checkVars の意味は上記と同じです。ゲッターが定義されている限り、プロパティは読み取り可能です。 また、 $checkVars が true の場合。クラスがメンバー変数を定義している限り、メンバー変数がパブリック、プライベート、または保護されているかどうかに関係なく、それらは読み取り可能であるとみなされます。
canSetProperty() は、プロパティが書き込み可能かどうかをテストします。パラメーター $checkVars の意味は上記と同じです。 setter が定義されていれば、プロパティを書き込むことができます。 同時に、 $checkVars は true になります。次に、クラスがメンバー変数を定義している限り、メンバー変数がパブリック、プライベート、または保護されているかどうかに関係なく、書き込み可能とみなされます。
ObjectとComponent
yiibaseComponent は yiibaseObject を継承しているため、プロパティなどの基本的な機能も備えています。
ただし、Componentではイベントやビヘイビアも導入しているため、単純にObjectのプロパティ実装メソッドを継承するのではなく、同じ仕組みに基づいて __get() __set() などの関数をオーバーロードします。ただし、実装メカニズムの点では、それらは同じです。これは理解には影響しません。
前に述べたように、Yii は公式にはコンポーネントベースのフレームワークとして位置付けられています。可視コンポーネントの概念は Yii の基礎です。 Yii のソースコードまたは API ドキュメントを読むことに興味がある場合は、Yii のほぼすべてのコアクラスが yiibaseComponent から派生 (継承) されていることがわかります。
Yii1.1 にはすでにコンポーネントがあり、当時は CComponent でした。 Yii2 は、Yii1.1 の CComponent を 2 つのクラス、yiibaseObject と yiibaseComponent に分割します。
その中で、Object は比較的軽量であり、ゲッターとセッターを通じてクラスのプロパティを定義します。コンポーネントはオブジェクトから派生し、イベントと動作をサポートします。したがって、Component クラスには 3 つの重要な特性があります:
property
event
behavior
これら 3 つは多かれ少なかれ理解できたと思います。この機能は、機能を強化し拡張するための重要なエントリ ポイントです。クラス関数とクラス動作の変更。 したがって、コンポーネントは Yii において非常に高い地位を占めています。
コンポーネントは、より多くの機能と利便性を提供しながら、イベントとビヘイビアの 2 つの機能を追加しました。これにより、ある程度の効率を犠牲にしながらも開発が容易になります。 何らかのデータを表すクラスなど、開発中にイベントとビヘイビアの 2 つの機能を使用する必要がない場合。 すると、Componentからの継承はできず、Objectからの継承となります。 一般的なアプリケーション シナリオでは、ユーザーが入力したデータのセットを表す場合はオブジェクトを使用します。 そして、オブジェクトの挙動やその処理に応答するイベントを扱う必要がある場合には、コンポーネントを使用するのが間違いありません。 効率の点では、Object の方がネイティブ PHP クラスに近いため、可能な場合は Object を最初に使用する必要があります。
関連する推奨事項:
以上がYiiのプロパティの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Windows オペレーティング システムは世界で最も人気のあるオペレーティング システムの 1 つであり、その新バージョン Win11 が大きな注目を集めています。 Win11 システムでは、管理者権限の取得は重要な操作であり、管理者権限を取得すると、ユーザーはシステム上でより多くの操作や設定を実行できるようになります。この記事では、Win11システムで管理者権限を取得する方法と、権限を効果的に管理する方法を詳しく紹介します。 Win11 システムでは、管理者権限はローカル管理者とドメイン管理者の 2 種類に分かれています。ローカル管理者はローカル コンピュータに対する完全な管理権限を持っています

OracleSQL の除算演算の詳細な説明 OracleSQL では、除算演算は一般的かつ重要な数学演算であり、2 つの数値を除算した結果を計算するために使用されます。除算はデータベース問合せでよく使用されるため、OracleSQL での除算演算とその使用法を理解することは、データベース開発者にとって重要なスキルの 1 つです。この記事では、OracleSQL の除算演算に関する関連知識を詳細に説明し、読者の参考となる具体的なコード例を示します。 1. OracleSQL での除算演算

PHP のモジュロ演算子 (%) は、2 つの数値を除算した余りを取得するために使用されます。この記事では、モジュロ演算子の役割と使用法について詳しく説明し、読者の理解を深めるために具体的なコード例を示します。 1. モジュロ演算子の役割 数学では、整数を別の整数で割ると、商と余りが得られます。たとえば、10 を 3 で割ると、商は 3 になり、余りは 1 になります。モジュロ演算子は、この剰余を取得するために使用されます。 2. モジュロ演算子の使用法 PHP では、% 記号を使用してモジュロを表します。

Linux システム コール system() 関数の詳細説明 システム コールは、Linux オペレーティング システムの非常に重要な部分であり、システム カーネルと対話する方法を提供します。その中でも、system()関数はよく使われるシステムコール関数の一つです。この記事では、system() 関数の使用法を詳しく紹介し、対応するコード例を示します。システム コールの基本概念 システム コールは、ユーザー プログラムがオペレーティング システム カーネルと対話する方法です。ユーザープログラムはシステムコール関数を呼び出してオペレーティングシステムを要求します。

Linuxのcurlコマンドの詳細な説明 要約:curlは、サーバーとのデータ通信に使用される強力なコマンドラインツールです。この記事では、curl コマンドの基本的な使用法を紹介し、読者がコマンドをよりよく理解して適用できるように実際のコード例を示します。 1.カールとは何ですか? curl は、さまざまなネットワーク要求を送受信するために使用されるコマンド ライン ツールです。 HTTP、FTP、TELNETなどの複数のプロトコルをサポートし、ファイルアップロード、ファイルダウンロード、データ送信、プロキシなどの豊富な機能を提供します。

ソフトウェア開発の分野で広く使用されているプログラミング言語として、C 言語は多くの初心者プログラマーにとって最初の選択肢です。 C言語を学ぶと、プログラミングの基礎知識を定着させるだけでなく、問題解決能力や思考力も向上します。この記事では、初心者が学習プロセスをより適切に計画できるようにするための C 言語学習ロードマップを詳しく紹介します。 1. 基本的な文法を学ぶ C 言語の学習を始める前に、まず C 言語の基本的な文法規則を理解する必要があります。これには、変数とデータ型、演算子、制御ステートメント (if ステートメント、

Promise.resolve() の詳細な説明には、特定のコード例が必要です。Promise は、非同期操作を処理するための JavaScript のメカニズムです。実際の開発では、順番に実行する必要があるいくつかの非同期タスクを処理する必要があることがよくあり、満たされた Promise オブジェクトを返すために Promise.resolve() メソッドが使用されます。 Promise.resolve() は Promise クラスの静的メソッドであり、

CSS の Bottom 属性の構文とコード例 CSS では、bottom 属性は要素とコンテナの下部の間の距離を指定するために使用されます。親要素の下部を基準とした要素の位置を制御します。ボトム属性の構文は次のとおりです: element{bottom:value;} ここで、element はスタイルが適用される要素を表し、value は設定されるボトム値を表します。 value にはピクセルなどの特定の長さの値を指定できます
