自己との再帰

興味深く、時には珍しいプロパティは、ドキュメントからPHPの5番目のバージョンを隠します。 言語構成体selfは 、定義により、静的メソッドとクラスプロパティを操作するために使用されます。 ただし、他の目的にも使用できます。

私は自分自身を宣言します...


多くはクラスの名前を変更する問題に直面していました(コンストラクターの名前を変更するのを忘れていますが、エラーはなく、すべてが機能しているようですが、どういうわけか曲がっています)。 この問題を解決するために、PHP5は__constructコンストラクターの標準名を導入しました
この問題は、 selfを使用してクラスの新しいインスタンスを宣言することでさらに軽減できます。 例:
クラスSpadar_Core_Object
{
/ **
*クラスの単一インスタンス
*
* @staticvar Spadar_Core_Object
* /
private static $ oInstance;

...

/ **
*クラスのシングルインスタンスを取得する(シングルトンデザインパターン)
*
* Spadar_Core_Objectシングルトンインスタンスを返す
* /
パブリックスタティック関数getInstance()
{
if(!isset(self :: $ oInstance))
{
self :: $ oInstance = new self();
}

return self :: $ oInstance;
}

...

}


これで、クラスの名前について心配する必要はありません。 ただし、この場合、そのような発表から多くの利益を得ることはありません。
次に、クールなライブラリのクールな開発者を想像してください。 そして今、単一のオブジェクトを使用したいすべてのクラスは、このためにSpadar_Core_Objectから継承されるべきです。 クラスコードを少し変更します。

クラスSpadar_Core_Object
{
/ **
*継承クラスの単一インスタンス
*
* @staticvar配列
* /
private static $ aInstances = array() ;

...

/ **
*派生クラスの単一のインスタンスを取得する(シングルトンデザインパターン)
*
* Spadar_Core_Objectシングルトンインスタンスを返す
* /
パブリックスタティック関数getInstance()
{
if(!isset( self :: $ aInstances [__ CLASS__] ))
{
self :: $ aInstances [__ CLASS__] = new self();
}

return self :: $ aInstances [__ CLASS__];
}

...

}


代替オプションがあります。 新しいselfの代わりに、変数$ sClassName = __CLASS__;を設定します そして次のように宣言します: new $ sClassName();

パラメータタイプチェック


PHP5では、メソッドパラメーターの型を指定できます。 selfを含めることをタイプとして指定できます

Spadar_Controller_WidgetクラスはSpadar_Core_Objectを拡張します
{
/ **
*子ウィジェットへのリンク
*
* var配列
* /
protected $ aChildWidgets = array();
...

/ **
*ウィジェットに子を追加する
*
* param Spadar_Controller_Widget $ oWidget new child
*以降の操作のためにオブジェクトと呼ばれるSpadar_Controller_Widgetを返します
* /
パブリック関数addChild( self $ oWidget
{
$ this-> aChildWidgets [] = $ oWidget;

$ thisを返します。
}

...

}


この例では、オブジェクトからツリーが構築されます;このため、各子はその子、つまり それらは特定のタイプでなければなりません。

それは私ですか?


PHPでのハイパーライブラリの作成に戻りましょう。 一部のパッケージでは、シリアル化によって情報が保存されているとします。 正しく動作させるために、指定されたインターフェースと一致するかどうかを確認する必要があります。

クラスSpadar_Core_Object
{
...

/ **
*オブジェクトの回復
*
* param string $ sInfo
*後続の操作のためにオブジェクトと呼ばれるSpadar_Core_Objectを返す
* /
プライベート関数parseObject($ sInfo)
{
$ mInfo = $ sInfo;
$ mInfo = @unserialize($ sInfo);

if( $ mInfo instanceof self
{
return $ mInfo;
}

$ thisを返します。
}

...

}


定数について...



クラス定数は、メソッドの本体内で通常の方法で使用できるだけでなく、それらを使用してわずかに歪めることもできます。

Spadar_Controller_UrlクラスはSpadar_Core_Objectを拡張します
{
const PARSE_PROTOCOL = 'スキーム';
const PARSE_HOST = 'host';
...
const BROWSER_ARG_PROTOCOL = self :: PARSE_PROTOCOL;

/ **
* URLから取得するパラメーター
*
* URLから取得するparam string $ sParamパラメーター
*文字列パラメーター値を返す
* /
パブリック関数getParam($ sParam = self :: PARSE_HOST
{
...
}

...

}

覚えておく必要があります:


Source: https://habr.com/ru/post/J15932/


All Articles