2016-10-20 4 views
0

メソッドを使用してオブジェクトを呼び出そうとしていますが、固まってしまいました。メソッドを呼び出すことによって、他の既存のオブジェクトの参照を取得する適切な方法はありますか?

私は、pseudo-struct-type変数に使用されたEntityという名前のクラスがあるとします。

オブジェクトEntityは、通常、他のインスタンス間で複数の関係を持ちます。だから、クラスEntityModuleを作成して、データベースの保存、読み込み、その他の便利なメソッドを処理します。私は、テーブルにEntityオブジェクトを挿入したい場合

ができます私は何をしようとしている

ます。..。 メソッドEntity->save()では、EntityModuleオブジェクトからEntityModule->saveEntity()メソッドを呼び出す必要があります。

どうすればよいですか? 私は、クラス内でインスタンス化された他のオブジェクトを使用していると思います。

..アマチュアにとって非常に混乱しています。以下は私の例です。

<?php 
class Container 
{ 
    public function __get($varName) 
    { 
     if(!isset($this->varName)) { 
      // Can it be more simpler? 
      switch($varName) { 
       case 'PDO': 
        $this->PDO('dbdbdb'); 
        break; 
       case 'SessionStorage': 
        $this->SessionStorage($this->PDO); 
        break; 
       default: 
        break; 
      } 
     } 
    } 

    // This is weird method.. can it be more simpler? 
    public function __call($method, $args) { 
     $n = count($args); 
     if($n === 0) { 
      $this->$method = new $method(); 
     } elseif($n === 1) { 
      $this->$method = new $method($args[0]); 
     } elseif($n === 2) { 
      $this->$method = new $method($args[0], $args[1]); 
     } elseif($n === 3) { 
      $this->$method = new $method($args[0], $args[1], $args[2]); 
     } elseif($n === 4) { 
      $this->$method = new $method($args[0], $args[1], $args[2], $args[3]); 
     } elseif($n === 5) { 
      $this->$method = new $method($args[0], $args[1], $args[2], $args[3], $args[4]); 
     } elseif($n === 6) { 
      $this->$method = new $method($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); 
     } elseif($n === 7) { 
      $this->$method = new $method($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); 
     }; 
    } 
} 
?> 

オブジェクトを動的にインスタンス化しようとします。

class Schema 
{ 
    public $id; 
    public $type; 
    public $name; 
    public $desc; 

    public function __construct(int $id = false, $type = 0, $name = 'Temporal schema name', $desc = 'No description.') 
    { 
     $this->id = $id; 
     $this->type = $type; 
     $this->name = $name; 
     $this->desc = $desc; 
     return; 
    } 

    public function save() 
    { 
     if(!isset($ctn->SchemaModule)) { 
      // This is another weird part. 
      // Is this the right way to make a class? Call a random instance inside the class? Doesn't it wierd?????????? ???? ?.?? ??? mentalbreak. 
      $ctn->SchemaModule->save($this); 
     } 
    } 
} 
+0

あなたが試していることを示している(短い)コード例がありますか、それに問題がありますか? – ChristianF

+0

ありがとうChristianF。私はスレッドを編集するだけです。 – GatesPlan

答えて

1

私はあなたが何をしようとしての100%はわからないが、私はあなたが物事を少しovercomplicatedているかもしれないと思います。あるいは少なくとも、それを抽象的なものにしました。

__call()マジック方法、ならびに他の「オーバーロード」マジック方法(__get() & __set())、非常に慎重に使用すべきです。彼らは物事をもっと複雑にするので、IDEサポートを壊し、一般的には厄介な解決策です。

この場合、おそらくクラスを若干再構築した後で、メソッドを書き出すのが最もよいと思います。そのため、PHP内部で何らかのメタ言語ではなく、明示的にすべてのロジックを書き留めておきます。
どちらか、またはファクトリパターンを使用してオブジェクトを生成します。必要なメソッドが明示的に記述されていて、コンテナの代わりにコントローラ内でこれらのオブジェクトを操作しているもの

2番目の部分については、$ctnオブジェクトの入手先、またはSchemaModuleの関係がわかりません。しかし、メソッド内から他のインスタンスを呼び出すことは、OOPでは珍しいことではありません。少なくとも、それらのインスタンスと依存関係にはっきりとマークが付けられていなければなりません。
ほとんどの場合、これらの依存関係はコンストラクタに提供され、クラス自体に保存される必要があります。コントローラーがクラスの依存関係を知り、オブジェクト生成時にそれらを提供する必要があることを意味します。これは、コード内であなたのロジックを明確に記入し、全体の「メタ神オブジェクト」の状況を避けることについて、私が上記で述べたコメントに再び結びついています。

ファクトリ・ロジック・パターンのファクトリ・パターンは、入力に応じて動的にオブジェクトを生成するため、ファクトリ・パターンと同じように見えるかもしれません。大きな相違点は、作成するオブジェクトはすべて、インターフェイスを共有するクラスに基づいているため、それらが互換性があり、相互に交換可能であることがわかります。
これはあなたのコードでは、あなたが欠けていると思います。

+0

ChristianFさん、ありがとうございます。私はまだ説明できないことがあると思う。私が気付いていることは、私は知識なしで「メタ神の対象物」を得ようとしており、私が避けなければならないことを知らなかった。 – GatesPlan

+0

@ user3477339:歓迎します。私が助けることができてうれしいです。 upvotingと答えを受け入れてくれてありがとう。 :) 私はさらに読むためにwww.phptherightway.comをお勧めします。これは可能な限り最良の方法でPHPを使用する方法に関する多くの情報を提供します。 – ChristianF

関連する問題