1

ネイティブ PHP のコード:

$href = phpUri::parse($target_url)->join($href);

動作していないCIで試したコード:

$CI->load->library('Phpuri', array($target_url));
$href = $CI->phpuri->parse($target_url);
$href = $CI->phpuri->join($href);

phpUri ネイティブ ライブラリはこちらで確認できます。CIで機能するように、クラス名rest is sameの大文字と小文字を変更しました。これを別のライブラリで使用しているため、CI インスタンスを使用しています。

4

1 に答える 1

1

CodeIgniter のパターンはシングルトンです。phpUri は静的呼び出しを使用します。それらの間には大きな違いがあるので、よく知っておくことをお勧めします。

ここでのポイントは、オブジェクト自体ではなく、クラスから要求されphpUriた静的呼び出しparseを使用することです。CodeIgniter はシングルトンであるため、サブオブジェクトを持つオブジェクトです (簡単にするために、それについてもっと読んでください)。そうは言っても、これが機能しない理由はphpUri、オブジェクトのように動作せず、静的呼び出しの後にのみオブジェクトを生成 (返す) ためです。

$href = phpUri::parse($target_url)->join($href);

次のように簡略化できます。

$parsed = phpUri::parse($target_url);
$href = $parsed->join($href);

最初の行は、オブジェクトを$parsed変数に返す静的呼び出しであり、それで遊ぶことができます。

シングルトンでは、クラスをオブジェクト属性として定義して「クラスの親」を作成することはできません。そのため、このライブラリを使用するには、最初にすべての静的呼び出しを書き直す必要があります。

しかし、オブジェクトの非静的メソッドで静的呼び出しを使用する CodeIgniter で抽象化レイヤー ライブラリを作成する方がはるかに簡単です。

class MyPhpUri {
    function parse($target_url) {
        return phpUri::parse($target_url);        
    }
}

次に、ライブラリで

$CI =& get_instance();
$CI->load->library('MyPhpUri');
$href = $CI->myphpuri->parse($target_url)->join($var);

それが抽象クラスです - インターフェイスを提供するクラスです。

于 2013-02-05T09:36:28.700 に答える