Мы можем создать объект класса внутри другого класса в PHP?

можем ли мы создать объект класса внутри другого класса в php?Я сделал небольшое приложение на php, теперь я пытаюсь преобразовать весь код в стиле class-methods-object.Теперь я в замешательстве.

5 ответов


Да, вы можете, но это увеличивает сцепление кода и затрудняет тестирование.
Я бы предложил создать его вне класса и передать его в качестве аргумента (он называется инъекцией зависимостей).

class Foo
{
}

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

$foo = new Foo();
$bar = new Bar($foo);

вы можете это сделать, но должны ли вы зависит от продолжительности жизни двух классов и их отношения друг к другу. В принципе, у вас есть выбор между состав и агрегация.

состав

вы используете композицию, когда созданный объект имеет время жизни, равное или меньшее, чем объект, который будет его использовать, например

class A 
{
    private $belongsToAOnly;

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

в этом случае A "владеет" IBelongToA. Когда A уничтожается, IBelongToA - это слишком разрушены. Он не может жить самостоятельно и, вероятно, просто деталь реализации A. Это может быть объекта value этого как Money или какой-либо другой тип данных.

из Крейга Лармана "применение UML и шаблонов":

композит отвечает за создание и удаление его частей - либо самостоятельно создавая/удаляя части, либо сотрудничая с другими объектами. Связанные с этим ограничения что если композит уничтожен, то его части должны быть уничтожены или присоединены к другому композиту"

агрегация

вы используете агрегацию, когда срок службы созданного объекта больше:

class A 
{
    private $dbAdapter;

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

В отличие от композиции, здесь нет подразумеваемого владения. A использует DbAdapter но когда A уничтожил DBAdapter живет. Это отношения "использует"вместо отношений" владеет".

Шаблон Создатель (Хватка)

хорошая эвристика, чтобы решить, когда объект может создать другой объект во время выполнения, можно найти в создатель шаблон в хватке который утверждает, что объекты могут создавать другие объекты, когда

  • экземпляры B содержит или композитно агрегирует экземпляры a
  • экземпляры B запись экземпляров a
  • экземпляры B тесно используют экземпляры a
  • экземпляры B имеют инициализация информации для экземпляров A и передача ее при создании.

кроме того, вы можете создавать фабрики, когда вам нужно создать экземпляры чего-то и агрегировать экземпляры фабрики, что даст вам очиститель разделение сотрудников и создателей.

Контролепригодность

проблема, связанная с созданием объектов внутри объектов, заключается в том, что их трудно проверить. Когда вы проводите модульное тестирование, вы обычно не требуется воссоздавать и загружать всю системную среду, но сосредоточиться на тестировании только этого конкретного класса в изоляции. Для этого вы меняете зависимости этого класса на Mock Объектов. Вы не можете сделать этого, когда используете композицию.

поэтому в зависимости от того, что делают сотрудники класса, вы можете решить всегда использовать агрегацию, потому что тогда вы эффективно делаете Инъекции Зависимостей все путь, что позволит вам легко поменять коллаборационистов класса, например, заменить их насмешками.


да, вы можете сделать это ..

вот один из примеров..

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();
 ?>

Да, вы также можете определить функцию в классе. Вы можете делать все в классе на 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();

?>

Да, вы можете создать объект из определенного класса из другого класса.

class SomeClass{

}
class SomeOtherClass {
     function hello(){
         $o = new SomeClass;
     }
}