Мне было интересно, разрешено ли создавать экземпляр класса внутри другого класса.
Или мне нужно создать его снаружи, а затем передать его через конструктор? Но тогда я бы создал его, не зная, нуждаюсь ли он в этом.
Пример (класс базы данных):
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(); ... }
Невозможно создать класс в другом классе в 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 в методе. НЕПРАВИЛЬНО.
Это помогает понять разницу между классом и объектом. Класс – это расширяемый шаблон кода программы для создания объектов. Объект относится к конкретному экземпляру класса.