8

PHP で別のクラス内にあるクラスのオブジェクトを作成できますか?PHP で小さなアプリケーションを作成しましたが、コード全体をクラス メソッド オブジェクトの方法で変換しようとしています。混乱しています。

4

5 に答える 5

18

あなたはそれを行うことができますが、そうすべきかどうかは、2 つのクラスの存続期間と相互の関係によって異なります。基本的に、 CompositionAggregationのいずれかを選択できます。

構成

作成されたオブジェクトの有効期間が、それを使用するオブジェクトと同じかそれよりも短い場合、コンポジションを使用します。

class A 
{
    private $belongsToAOnly;

    public function __construct()
    {
        $this->belongsToAOnly = new IBelongToA;
    }
}

この場合Aは "owns" IBelongToA. Aが破壊されると、それIBelongToAも破壊されます。単独では存在できず、実装の詳細に過ぎない可能性がありAます。ValueObjectのようなものMoneyや、その他のデータ型である可能性があります。

Craig Larman の「UML とパターンの適用」から:

コンポジットは、そのパーツの作成と削除を担当します-それ自体でパーツを作成/削除するか、他のオブジェクトと共同作業します。この制約に関連するのは、コンポジットが破棄された場合、そのパーツを破棄するか、別のコンポジットに接続する必要があるということです"

集計

作成されたオブジェクトの有効期間が長い場合は、集計を使用します。

class A 
{
    private $dbAdapter;

    public function __construct(DbAdapter $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }
}

コンポジションとは異なり、ここには所有権の意味はありません。A使用しますが、破壊されDbAdapterたときは生き続けます。「所有」関係ではなく、「使用」関係です。ADBAdapter

クリエイターパターン(GRASP)

実行時にオブジェクトがいつ別のオブジェクトを作成できるかを決定するための優れたヒューリスティックは、GRASP の Creator Pattern で見つけることができます。

  • B のインスタンスは、A のインスタンスを含むか、複合的に集約します
  • B のインスタンス A のレコード インスタンス
  • B のインスタンスは A のインスタンスを密接に使用します
  • B のインスタンスは、A のインスタンスの初期化情報を持っており、作成時にそれを渡します。

または、何かのインスタンスを作成し、ファクトリ インスタンスを集約する必要があるときはいつでもファクトリを作成できます。これにより、共同作業者と作成者をより明確に分離できます。

テスト容易性

オブジェクト内にオブジェクトを作成することに起因する問題は、テストが難しいことです。単体テストを行う場合、通常、システム環境全体を再作成してブートストラップするのではなく、その特定のクラスだけを分離してテストすることに集中します。そのためには、そのクラスの依存関係をMock Objectsと交換します。コンポジションを使用する場合、それはできません。

したがって、クラスの共同作業者が何をするかに応じて、常に集約を使用することを決定することをお勧めします。これは、依存性注入を効果的に実行しているためです。これにより、クラスの共同作業者を簡単に交換できます。それらをモックで。

于 2012-05-20T11:51:53.630 に答える
8

はい、できますが、コードの結合が増え、テストが難しくなります。
クラスの外で作成し、引数として渡すことをお勧めします(依存性注入と呼ばれます)。

class Foo
{
}

class Bar
{
  public function __construct(Foo $foo)
  {
    $this->foo = $foo;
  }
}

$foo = new Foo();
$bar = new Bar($foo);
于 2012-05-17T10:38:26.990 に答える
4

はい、できます..

ここに一例があります..

a.php
<?php
    class a{
        public function function_1(){
           echo "b";
        }
     }
?>


b.php
<?php
     include_once ("a.php");
     class b{
        public function function_b(){
             $a = new a;
             $a->function_1();
        }
      }
      $b= new b;
      $b->function_b();
 ?>
于 2012-05-17T10:54:29.640 に答える
3

はい、別のクラス内から特定のクラスからオブジェクトを作成できます。

class SomeClass{

}
class SomeOtherClass {
     function hello(){
         $o = new SomeClass;
     }
}
于 2012-05-17T10:34:06.600 に答える
2

はい、クラスで関数を定義することもできます。PHPのクラスですべてを行うことができます。混乱した場所にコードを投稿してください。

例: クラス内のオブジェクト。

class Foo
{
   public $bar; // another object!

   public __construct()
   {
      $this->bar = new Bar();
    }
}

(グローバル) クラス内の関数

<?php
    class Foo
    {
        public function __construct()
        {
            function __construct()
            {
                echo "Yes, I'm a global function!";
            }
        }
    }

    new Foo();
    __construct();

?>
于 2012-05-17T10:33:12.500 に答える