Подтвердить что ты не робот

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

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

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

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

class some{

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

Ответ 1

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

include SITE_ROOT . 'applicatie/' . 'db.class.php';

class some {

    public function __construct() {
        if (...) {
            $this->db = new db;
        }
    }

}

Ответ 2

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

class myClass{

    class myNestedClass{

    }

}

/* THIS IS NOT ALLOWED AND SO IT WON'T WORK */

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Это возможно в 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;
    }
});

Ответ 7

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

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

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

Ответ 8

Я просто вижу это сейчас и хочу добавить свой комментарий. Это может быть полезно для всех. Кто-нибудь слышал о чертах php? Хотя черты не импортируют другой класс, а только импортируют черты в другой класс. Таким образом, вместо того, чтобы пытаться импортировать несколько классов, у вас может быть основной класс, в то время как подклассы будут действовать как черты, позволяющие вам использовать их в основных/родительских классах.