よく理解していないコードが数行あります。解析するのを手伝ってください。
このコードは ThinkPHP フレームワークの小さな断片から抜粋したものです
PHP コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> /**
+----------------------
* 取得对象实例 支持调用类的静态方法
+----------------------
* @param string $class 对象类名
* @param string $method 类的静态方法名
+----------------------
* @return object
+----------------------
*/
static public function instance($class,$method='') {
$identify = $class.$method;
if(!isset(self::$_instance[$identify])) { //这一行的self::不是太明白怎么回事
if(class_exists($class)){ //这个是判断如果类存在?
$o = new $class();
if(!empty($method) && method_exists($o,$method))
self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); //这一行怎么解释?
else
self::$_instance[$identify] = $o; //这一行怎么解释?
}
else
halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt从来没见过这东西……
}
return self::$_instance[$identify];
}
ログイン後にコピー
-----解決策---------
このクラスの名前を次のように仮定します。 Core.php
Core.php には静的プロパティがあります
public static $_instance //このプロパティは配列であることに注意してください。
この関数は 2 つの関数を実装します:
1. ファクトリ クラス: オブジェクトの作成に使用されます。 メソッドが空の場合は、クラスが返されます。
2. 特定のクラスのメソッドを実行します。 メソッドが空でない場合は、メソッドの実行結果が返されます。
if(!isset(self::$_instance[$identify])) { // 静的メソッドへの参照には Self を使用します。 Self: 現在のオブジェクトではなく、現在のクラス自体を表します。
if(class_exists($class)){ //これは、このクラス ファイルが存在するかどうかを判断するためのものです。もちろん、これはカプセル化されたメソッドです。これは File_exist(filename) として理解できます。
self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); // これは実際には何かのメソッドへのリフレクション呼び出しです。クラスの。
self::$_instance[$identify] = $o; // メソッド名が空の場合は、オブジェクトを配列に入れます。
halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt という単語は停止を意味します。 コンパイルが停止するようです。
------解決策----------------------okayu がとてもわかりやすく説明してくれました
------解決策---------この関数は 2 つの関数を実装します:
1。ファクトリ クラス: オブジェクトの作成に使用されます。 メソッドが空の場合は、クラスが返されます。
2. 特定のクラスのメソッドを実行します。 メソッドが空でない場合は、メソッドの実行結果が返されます。
------------------------
コードを読むときは、全体的な状況を見る必要があります。
とても分かりやすく説明していただきました。私もそこから学びました。
大きいものから小さいものまで。
------解決策------------------
このクラスは登録クラスです! ファクトリータイプとは言えません!制限があります
1) クラスが初期化されていない場合は、初期化されてクラス属性配列に格納されます。クラスが初期化されている場合は、初期化されたクラスが返されます。 (ファクトリ クラスは毎回新しいインスタンスを返す必要があります。
2) メソッドがある場合は、メソッドの呼び出し結果を返します。 (パラメータは渡せません、いわゆる静的メソッドではなく、任意のメソッドが呼び出されます)
call_user_func_array(array(&$o, $method)) ここの&が必要なのか分かりません。
------解決策---------&$o は php では $o のようです
C ポインタに似ていますが、異なります。
------解決策---------