3

Global を使用してクラスインスタンスをフェッチすることなく、別のクラスからクラスメソッドを呼び出す最良の方法を探しています。「グローバルは悪」であることがわかりました。

これをさらに説明するコードを次に示します。

class Assets{
 public $assets = array();
 public function add($asset){
  $this->assets[] = $asset;
 }
}

ここで、ここから Assets/call メソッドを呼び出したい..

$assets = new Assets;
class Form{
 public function __construct(){
  global $assets;
  $assets->add('Form');
 }
}

そのようなシナリオでグローバルを使用しているのはそれが悪いですか? もしそうなら、他にどのような方法が最善であると考えられていますか?

PS: クラスのインスタンスを 1 つだけ操作する必要があります。2 番目のクラス内に新しいインスタンスを作成したくないということです。

4

6 に答える 6

1

依存性注入がその方法です。そして、このファクトリ機械化を使用して、オブジェクト インスタンスを他のオブジェクトに渡します。のように(単なるサンプル、テストしませんでした):

class UI{

public $somthing = 'Cool';

public function newComponent($name){
    return new $name($this);
}

}

$ui = new UI;
class Form{
    public $ui;

    public function __construct(UI $ui){
        $this->ui = $ui;
    }

    public function say(){
        print $this->ui->somthing;
    }
}

$form = $ui->newComponent('Form');

$form->say(); // print 'Cool'.
于 2013-05-28T21:37:03.573 に答える
1

あなたはこれを試すことができます、

class Form{
 public function __construct(Assets $assets){
  //$assets = new Assets;
  $assets->add('Form');
 }
}
于 2013-05-28T16:46:10.450 に答える
-1

どうですか

<?php
class Assets
{
    protected static $assets = array();

    protected function add($el)
    {
        self::$assets[] = $el;
    }

    public function getAssets()
    {
        return self::$assets;
    }
}

class Form extends Assets
{
    public function __construct()
    {
        parent::add('Form');
    }
}

class Css extends Assets
{
    public function __construct()
    {
        parent::add('Style');
    }
}

$assets = new Assets;
new Form;
new Css;
var_dump($assets->getAssets()); // Prints: array(2) { [0]=> string(4) "Form" [1]=> string(5) "Style" }
于 2013-05-28T17:19:41.550 に答える