2016-10-18 6 views
0

私は、いくつかのコアファイルとモデルを 'model'ディレクトリに入れてカスタムフレームワークを作成しました。今私は必要なときにのみモデルからオブジェクトを作成しています。しかし、私はすべてのモデルクラスから自動的にオブジェクトを作成したいと思います。たとえば、「モデル」ディレクトリにある三つのモデルクラス、PHPでの動的オブジェクトの作成

//-----------[ ObjectOneModel.php ]------------------- 
class ObjectOneModel 
{ 
} 
//-----------[ ObjectTwoModel.php ]------------------- 
class ObjectTwoModel 
{ 
} 
//-----------[ ObjectThreeModel.php ]------------------- 
class ObjectThreeModel 
{ 
} 

と正常に動作しますが、ObjectOneからのデータがObjectThreeModelに使用されているので、例えばObjectThreeModelがObjectOneへのアクセスを必要とする一つのメインコントローラ

class Controller 
{ 
    public function __construct() 
    { 
     $files = scandir('models/'); 
     foreach ($files as $file) 
     { 
      if (preg_match('/^[A-Z]{1}[A-Za-z]*Model.php/', $file)) 
      { 
       $object_name = str_replace('Model.php', '', $file); 
       $class_name  = str_replace('.php', '', $file); 
       $this->{$object_name} = new $class_name(); 
      } 
     } 
    } 
} 

があります。私はそこに新しいオブジェクト

//-----------[ ObjectThreeModel.php ]------------------- 
class ObjectThreeModel 
{ 
    public function __construct() 
    { 
     $ObjectOne = new ObjectOneModel(); 
    } 
} 

を作成しますが、私は、メモリ内の2つの同じオブジェクトがあるので、これは醜い解決することを考えることを考え出しました。私は作成されたオブジェクトで必要なオブジェクトをコンストラクタに伝える方法を見つける必要があり、コンストラクタはこのオブジェクトを自分自身のパラメータとして渡します。それは記述するのが難しいですが、私はあなたが私の問題を理解することを願っています。

+0

このオブジェクトにアクセスさせるオブジェクトのコンストラクタにパラメータを渡します。つまり、 'public function __construct($ otherObject){$ objectOne = $ otherObject}' – RiggsFolly

+0

また、http://php.net/manual/ en/language.oop5.autoload.php。 – AbraCadaver

+0

AbraCadaver、私のプロジェクトで既にオートロードを使用していますが、私の問題点はありませんが、助けてくれてありがとうございます:-) – Bejkrools

答えて

0

私はあなたの現在のアプローチの醜さは、あなたがモデルディレクトリ全体をスキャンして何が見つかってもロードしているという事実だと思います。代わりに、必要に応じてオブジェクトをロードするために、いくつかのタイプのファクトリパターンの使用を検討する必要があります。参考:

簡単な例:あなたがそれらを必要としてあなたがオブジェクトだけをロードしているので

class SimpleFactory 
{ 
    public function build($model) 
    { 
     $obj = __NAMESPACE__ . '\\models\\' . $model . '.php'; 
     if (class_exists($obj)) { 
      return new $obj(); 
     } 
    } 
} 

class Controller 
{ 
    private $factory; 

    public function __construct() 
    { 
     $this->factory = new SimpleFactory(); 
    } 

    public function someMethod() 
    { 
     // this method has a dependency 
     $oneModel = $this->factory->build('oneModel'); 
    } 
} 

これはクリーナーです。あなたはあなたの正確なニーズに合わせてさらにこれを修正することができます。

関連する問題