Жили были 2 класса Код (Text): class class_1 { public function __construct() { echo '1'; } } class class_2 { public function __construct() { echo '2'; } } $c_1=new class_1(); $c_2=new class_2(); И они работали очень хорошо по отдельности Потом решено было их переписть Код (Text): class class_2 { public function __construct() { include 'class_1.php'; $c_1=new class_1(); echo '2'; } } $c_2=new class_2(); И вроде все было нормально Но потом появился программист который решил обойтись без инклюда и переписал буквально Код (Text): class class_2 { public function __construct() { class class_1 { public function __construct() { echo '1'; } } $c_1=new class_1(); echo '2'; } } $c_2=new class_2(); Вопрос: Как интепретатор php разворачивает второй пример? Ведь 3-й пример работать не будет если так буквально развернуть код При include внутри класса куда происходит инклюд файла? ---------------------------------- Видел что допустим инклюдят перед классом, допустимо ли инклюдить в классе?
класс пойдёт в глобальное пространство ко всем остальным классам. А переменные - внутрь метода файл1 Код (PHP): class test1 { private $test = '1'; public function __construct () { echo 'created test' . $this->test . '<br>'; include 'test2.php'; } public function name () { echo 'name is test' . $this->test . '<br>'; } } $test1 = new test1(); $test1->name(); файл2 Код (PHP): class test2 { private $test = '2'; public function __construct () { echo 'created test' . $this->test.'<br>'; } public function name () { echo 'name is test' . $this->test.'<br>'; } } $test2 = new test2(); $test2->name(); так будет работать А если попробовать обратиться к $test2 извне конструктора $test1 - фатал эррор
Re: Include внутри класса - как происходит инклюд интепретат спасибо за подробный ответ у меня в функции одного из классов происходит поиск и инклюд модулей (поиск файлов по папкам), собственно все работает, но я задумался, а правильно ли это может нужно искать модули в самом начале где происходят основные инклюды, но запускать классы модулей все равно придется в том же месте где сейчас происходит их инклюд...
Re: Include внутри класса - как происходит инклюд интепретат не, ну классы станут доступными при инклуде для создания экземпляров. но то барахло, которое народилось внутрях функции, оно внутрях и останется. Хотя доступ к этим штукам можно организовать через синглтон или просто статик переменные.
Re: Include внутри класса - как происходит инклюд интепретат напишу немного поподробней есть файл boot.php в нем инклюдятся все основные классы, в том числе класс Module потом запускается статическая функция load::module(); в ней происходит поиск по папкам модулей-классов и они инклюдятся и сразу создаются их обьекты (конструкторы прописывают новые инструкции в роут) классы модулей наследуются от класса Module который приинклюден в самом начале в общем я понимаю из за наследования все модули должны быть в области видимости класса Module? стоит ли переделывать поиск и инклю модулей реализовав его в файле boot.php?
Re: Include внутри класса - как происходит инклюд интепретат стоит воспользоваться autoload и завести правило отображения namespace + classname => path to module
Re: Include внутри класса - как происходит инклюд интепретат автолоад там реализован, но его можно отключить и вот тогда возникает этот вопрос мне не особо хочется переписывать свой проект и нэйм спэйс реализован частично и вот так namespace => path to module не понял как такое namespace + classname => path to module вообще может работать если в папке несколько классов с одинаковым нэймспэйсом?
Re: Include внутри класса - как происходит инклюд интепретат конечно. classname у них разный, имя файла видимо тоже, почему не сможет?
Re: Include внутри класса - как происходит инклюд интепретат а... все понял... вот только нужен ли нэймспэйс для модулей? как бы имена классов там начинаются со слова module_имямодуля и собственно одинаковых папок создать не получится в любом случае
Re: Include внутри класса - как происходит инклюд интепретат Я считаю неймспейсы уже победили и стесняться их не надо. Ты делай как тебе заблагорассудится.