ホームページ > バックエンド開発 > PHPチュートリアル > よく理解できないコードが数行あります。分析と対処方法については専門家に相談してください。

よく理解できないコードが数行あります。分析と対処方法については専門家に相談してください。

WBOY
リリース: 2016-06-13 13:51:25
オリジナル
960 人が閲覧しました

よく理解していないコードが数行あります。解析するのを手伝ってください。
このコードは 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 ポインタに似ていますが、異なります。
------解決策---------
話し合う
このクラスは登録済みのクラスです。 ファクトリータイプとは言えません!制限があります

1) クラスが初期化されていない場合は、初期化されてクラス属性配列に格納されます。クラスが初期化されている場合は、初期化されたクラスが返されます。 (ファクトリ クラスは毎回新しいインスタンスを返す必要があります。

2) メソッドがある場合は、メソッドの呼び出し結果を返します。 (パラメータを渡すことはできず、静的メソッドではなく任意のメソッドが呼び出されます)

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