4

まず第一に、私はクラスを拡張したくありません。理想的にはこれをやりたいと思います。

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this =& $Five;
}

変数$Fiveが他のライブラリを含むコンテナクラスであるシステムがあります。これをFiveのローカル変数に割り当てることができます...つまり

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this->Five = $Five;
}

ただし、これを避けようとしている理由は、関数呼び出しが少し長くなるためです。

$this->Five->load->library('library_name');

その少し醜い。はるかに良いでしょう。

$this->load->library('library_name');

これに対する最善の解決策は何ですか?

4

7 に答える 7

5

私はそれを思います

$this->Five->load->library('library_name');

クラスにヘルパークラスを拡張させることに決めない限り、が最善の選択肢になります。別名

class Something extends Helper_Class

ただし、これはHelper_Class、クラスをインスタンス化するたびにインスタンス化されることを意味します。


別の方法は、すべてのヘルパークラスをクラスメンバーに割り当てる疑似静的クラスを作成することです。

public function setGlobals($five)
{
    $this->loader = $five->loader;
}

それからそれを呼んでください

public function __construct($five)
{
    someClass::setGlobals($five);
}

$Fiveがグローバルの場合、global $Fiveいつでも使用できますが、それをすべての関数の先頭に置くと、コーディングが不適切に思えます。


また、グローバル変数は一般的に悪い考えであり、「依存性注入」またはグローバルの代替を検索することをお勧めします。別名

public function __construct($five);

それ以外の

global $five;

グローバルは、外部変数が存在し、すでに設定されていることに依存していますが、依存性注入は、Fiveクラスのインスタンスであると想定している変数を要求します。

PHP 5.1を実行している場合(Gordonに感謝)、次のようにすることで、変数がのインスタンスであることを保証できますFiveClass

public function__construct(FiveClass $five);
于 2010-01-14T20:19:26.270 に答える
2

$ thisは、定義しているクラスの現在のインスタンスへの参照です。私はあなたがそれに割り当てることができるとは思わない。ファイブがグローバルである場合、これを実行できるはずです。

$Five->load->library('library_name');
于 2010-01-14T20:17:35.087 に答える
1

5つの静的クラスメンバーの関連するデータメンバーとメソッドを作成するのはどうですか?これ

$this->Five->load->library('library_name');

これになります

Five::load->library('library_name');

どこにでも&$Fiveを渡す必要はありません。

于 2010-01-14T20:27:06.767 に答える
1

依存性注入パターンのある種の実装を使用したい場合があります。

コンピュータープログラミングにおける依存性注入(DI)は、ソフトウェアコンポーネントに外部依存性を提供するプロセスを指します。これは制御の反転の特定の形式であり、反転される懸念は必要な依存関係を取得するプロセスです。

symfonyDIコンテナのドキュメントも参照してください。「グローバル」の処理方法を改善したい場合は、このDIコンテナの実装を強くお勧めします。

また、 「グローバルオブジェクトにアクセスするための最良の方法」に関するこの質問を読むこともできます。

于 2010-01-14T20:23:47.397 に答える
1

$ thisを上書きすることはできませんが(C ++など) 、メソッド呼び出しには__call()を使用し、プロパティには__get()、__ set()、__ isset()を使用して簡単に集計を作成できます。

__call()の例:

class Five {
  public function bar() {
    echo __METHOD__, " invoked\n";
  }
}

class Foo {
  protected $Five = null;

  public function __construct(Five $five=null) {
     if ( is_object($five) ) {
       $this->Five = $five;
     }
   }

  public function __call($name, $args) {
    // there's no accessible method {$name} in the call context
    // let's see if there is one for the object stored in $five
    // and if there is, call it.
    $ctx = array($this->Five, $name);
    if ( !is_null($this->Five) && is_callable($ctx) ) {
      return call_user_func_array($ctx, $args);
    }
    else {
      // ....
    }
  }
}

$foo = new Foo(new Five);
$foo->bar();

印刷しFive::bar invokedます。
私の意見では、最大の欠点は、オブジェクトが何をできるかを「外部から」見るのがはるかに難しいということです。

于 2010-01-14T20:32:54.243 に答える
0

$thisこれはPHPの変数のように見える特別なもののひとつですが、舞台裏では少し異なって扱われるため、再割り当てすることはできないと確信しています。

メソッド呼び出しのセマンティクスが長くなりすぎることが懸念される場合loadは、オブジェクトプロパティの代わりにメソッド呼び出しを行います

$this->load()->library('library_name');

public function load()
{
    return $this->Five;
}
于 2010-01-14T20:26:04.430 に答える
0

PHPマジックメソッドを使用する方が良いかもしれませんか? http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

于 2010-01-14T20:41:55.147 に答える