Можно ли создать экземпляр класса PHP внутри другого класса?

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

Или мне нужно создать его снаружи, а затем передать его через конструктор? Но тогда я бы создал его, не зная, нуждаюсь ли он в этом.

Пример (класс базы данных):

class some{ if(.....){ include SITE_ROOT . 'applicatie/' . 'db.class.php'; $db=new db 

Вы не можете определить класс в другом классе. Вы должны включать файлы с другими классами вне класса. В вашем случае это даст вам два класса верхнего уровня db и some . Теперь в конструкторе some вы можете создать экземпляр db . Например:

 include SITE_ROOT . 'applicatie/' . 'db.class.php'; class some { public function __construct() { if (...) { $this->db = new db; } } } 

Люди, говорящие, что можно «создать класс внутри класса», похоже, означают, что можно создать объект / экземпляр внутри класса. Я не видел примера фактического определения класса в другом определении класса, которое будет выглядеть так:

 class myClass{ class myNestedClass{ } } /* THIS IS NOT ALLOWED AND SO IT WON'T WORK */ 

Поскольку вопрос заключался в том, «возможно ли создать класс внутри другого класса», теперь я могу только предположить, что это НЕ возможно.

Я просто хотел указать, что динамическое определение класса можно найти в другом определении класса.

Лукас прав, что мы не можем определить класс внутри другого класса, но мы можем включать () или require () их динамически, так как все функции и классы, определенные во включенном файле, будут иметь глобальную область. Если вам нужно загружать класс или функцию динамически, просто включите файлы в одну из функций класса. Вы можете сделать это:

 function some() { require('db.php'); $db = new Db(); ... } 

http://php.net/manual/en/function.include.php

Невозможно создать класс в другом классе в PHP. Создание объекта (экземпляр класса) в другом объекте – это другое дело.

Нет, это невозможно. Вложенные классы и агрегирующие объекты – это разные механизмы. Вложенные классы означают имена классов. Класс A, вложенный в класс B, будет называться «B \ A» (?). Из v5.3 вы можете вложить имена классов (и некоторые другие имена) в пространства имен.

Это возможно в PHP 7 с анонимными классами .

См. Пример из документов :

 class Outer { private $prop = 1; protected $prop2 = 2; protected function func1() { return 3; } public function func2() { return new class($this->prop) extends Outer { private $prop3; public function __construct($prop) { $this->prop3 = $prop; } public function func3() { return $this->prop2 + $this->prop3 + $this->func1(); } }; } } echo (new Outer)->func2()->func3(); // Output: 6 

Это простой пример, показывающий использование анонимных классов, но не изнутри класса:

 // Pre PHP 7 code class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); // PHP 7+ code $util->setLogger(new class { public function log($msg) { echo $msg; } }); 

(Edit) Хорошо, вопрос и пример того, что вы пытаетесь выполнить, сбивают с толку. Кажется, из вашего примера вы пытаетесь ОПРЕДЕЛИТЬ класс внутри другого класса.

Правильное имя для этого – NESTED CLASS, и это невозможно в PHP. Итак, к вашему примеру ответ «НЕТ». В любом случае, не в PHP. Другие языки позволят «вложенные классы». Java – пример.

Например, это НЕ будет работать в PHP

 class outer_class{ class inner_class{ ... } ... } 

Теперь заданный вопрос заключается в создании AN INSTANCE класса в другом классе.

Для этого ответ «ДА», вы можете УСТАНОВИТЬ «объект» внутри «класса». Мы делаем это все время.

 class simple_class{ protected $instanceOfOtherClass; public function instanciateObject_KeepingAReferenceToIt(){ // create an instance of OtherClass and associate it to $this->instanceOfOtherClass $this->instanceOfOtherClass = new OtherClass(); } public function instanciateObject_Without_KeepingAReferenceToIt(){ // create an instance of OtherClass and return it return new OtherClass(); } } 

Класс может даже создать экземпляр. Это то, что делает знаменитый синглтон, и многие другие шаблоны Creation . К сожалению, некоторые люди считают, что знание об инъекции зависимостей означает, что они никогда больше не будут называть NEW в методе. НЕПРАВИЛЬНО.

Это помогает понять разницу между классом и объектом. Класс – это расширяемый шаблон кода программы для создания объектов. Объект относится к конкретному экземпляру класса.