PHP でのクラスのインスタンス化に関するいくつかの注意事項

WBOY
リリース: 2016-06-13 12:30:30
オリジナル
997 人が閲覧しました


以下はモデル(モジュール)を呼び出す関数です。この関数の基本的な機能は、(クラスに抽象化された) モデルの名前を指定し、モデル ディレクトリでこのクラスのスクリプトを検索し、インスタンス化後にそれを返します。このアプローチの利点の 1 つは、読み込みとインスタンス化が自動的に行われるため、最大限の柔軟性が得られることです。以下のコードを見てください。長くも複雑でもありません:

function &load_class($class_name, $param = null, $instantiate = true)
{
static $objects = array ( );

$class_name = ucfirst(strto lower($class_name));
if (isset($objects[$class_name])) {
return $objects[$class_name]; > }

$class_file = DIR_MODELS . "/{$class_name}.inc.php";
if (file_exists($class_file)) {
require_once $class_file; if (!class_exists($class_name)) {
return false;
} else {
$objects[$class_name] =& new $class_name($param);
return $objects[$class_name] ] ;
この関数には $class_name、$param、$instaniate という 3 つのパラメータしかありません。ここで、$param はコンストラクターのパラメーターであり、$instaniate はオプションです。関数内の $objects 配列は静的変数であることに注意してください。つまり、この関数が呼び出されたときに配列は解放されず、この配列内のデータは次回この関数が呼び出されたときに保存されます。この利点は、ほとんどのクラスをインスタンス化した後、それを繰り返し呼び出す必要がある場合に、このクラスのインスタンスを直接返すことができるため、繰り返しの呼び出しが回避され、パフォーマンスが向上することです。コードは次のとおりです:

static $objects = array();

if (isset($objects[$class_name])) {
return $objects[$class_name];
}もう 1 つの継続コードは、このクラス名のファイルがあるかどうかを検出することです。存在する場合は、このファイルをロードし、指定された名前のクラスを探します。クラスが見つかった場合は、そのクラスがインスタンス化されます。そのためには、スクリプト内のクラス名がスクリプトのファイル名と一致している必要があります。これは今後のコード管理にも役立つと思います。

$instaniate パラメータはこの時点で機能します。このパラメータは、関数がファイル名とファイル名を繰り返し検索することを避けるために、$objects の下にマーク ビット (null) を作成するように関数に指示します。ロードと検索を繰り返します。

$class_file = DIR_MODELS . "/{$class_name}.inc.php";
if (file_exists($class_file)) {
require_once $class_file; !class_exists($class_name)) {
return false;
} else {
$objects[$class_name] =& new $class_name($param);
return $objects[$class_name];

ステートメント:

$objects[$class_name] =& new $class_name($param); 何度でも確認できます。 $class_name は関数内の文字列変数です。キーワード new は、指定された文字列 (存在する場合) のクラスを動的にインスタンス化できます。この呼び出し方法については、PHP のマニュアルとこちらを参照してください。

この関数の欠点は、異なるクラスのコンストラクターに異なる数のパラメーターを渡すことをどのように考慮するかということです。おそらく、call_user_func_array などの関数を使用して実装できますが、このアプローチは非常に優雅ではありません。ここで少し考える必要があります。実際、file_exists などのファイルの存在のテストは __autoload 関数に引き渡すことができますが、interface_exists などの他の関数も __autolaod 関数を呼び出すため、関数内では簡単なテストのみが行われます。 。

PHP5 は PHP4 よりもオブジェクト指向です。コーディングの考え方を更新する時期が来たと思います。 PHP5 のクラスとオブジェクトに関する非常に優れたチュートリアルがここにあります。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート