За последние 24 часа нас посетили 18644 программиста и 1604 робота. Сейчас ищут 1005 программистов ...

Include внутри класса - как происходит инклюд интепретаторо

Тема в разделе "Прочие вопросы по PHP", создана пользователем jora, 10 окт 2013.

  1. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Жили были 2 класса

    Код (Text):
    1.     class class_1 {
    2.         public function __construct() {
    3.             echo '1';
    4.         }
    5.     }
    6.    
    7.     class class_2 {
    8.         public function __construct() {
    9.             echo '2';
    10.         }
    11.     }
    12.    
    13.     $c_1=new class_1();
    14.     $c_2=new class_2();
    И они работали очень хорошо по отдельности

    Потом решено было их переписть

    Код (Text):
    1.     class class_2 {
    2.         public function __construct() {
    3.             include 'class_1.php';
    4.             $c_1=new class_1();
    5.             echo '2';
    6.         }
    7.     }
    8.    
    9.     $c_2=new class_2();
    И вроде все было нормально

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

    Код (Text):
    1.     class class_2 {
    2.         public function __construct() {
    3.             class class_1 {
    4.                 public function __construct() {
    5.                     echo '1';
    6.                 }
    7.             }
    8.             $c_1=new class_1();
    9.             echo '2';
    10.         }
    11.     }
    12.     $c_2=new class_2();
    Вопрос:

    Как интепретатор php разворачивает второй пример?

    Ведь 3-й пример работать не будет если так буквально развернуть код

    При include внутри класса куда происходит инклюд файла?

    ----------------------------------
    Видел что допустим инклюдят перед классом, допустимо ли инклюдить в классе?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    класс пойдёт в глобальное пространство ко всем остальным классам. А переменные - внутрь метода

    файл1
    Код (PHP):
    1. class test1 {
    2.  
    3.   private $test = '1';
    4.  
    5.   public function __construct () {
    6.     echo 'created test' . $this->test . '<br>';
    7.     include 'test2.php';
    8.   }
    9.  
    10.   public function name () {
    11.     echo 'name is test' . $this->test . '<br>';
    12.   }
    13. }
    14.  
    15. $test1 = new test1();
    16. $test1->name();
    файл2
    Код (PHP):
    1. class test2 {
    2.   private $test = '2';
    3.  
    4.   public function __construct () {
    5.     echo 'created test' . $this->test.'<br>';
    6.   }
    7.  
    8.   public function name () {
    9.     echo 'name is test' . $this->test.'<br>';
    10.   }
    11. }
    12.  
    13. $test2 = new test2();
    14. $test2->name();
    так будет работать

    А если попробовать обратиться к $test2 извне конструктора $test1 - фатал эррор
     
  3. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Re: Include внутри класса - как происходит инклюд интепретат

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

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Include внутри класса - как происходит инклюд интепретат

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

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Re: Include внутри класса - как происходит инклюд интепретат

    напишу немного поподробней
    есть файл boot.php в нем инклюдятся все основные классы, в том числе класс Module
    потом запускается статическая функция load::module();
    в ней происходит поиск по папкам модулей-классов и они инклюдятся и сразу создаются их обьекты (конструкторы прописывают новые инструкции в роут)
    классы модулей наследуются от класса Module который приинклюден в самом начале

    в общем я понимаю из за наследования все модули должны быть в области видимости класса Module?

    стоит ли переделывать поиск и инклю модулей реализовав его в файле boot.php?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Include внутри класса - как происходит инклюд интепретат

    стоит воспользоваться autoload и завести правило отображения namespace + classname => path to module
     
  7. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Re: Include внутри класса - как происходит инклюд интепретат

    автолоад там реализован, но его можно отключить
    и вот тогда возникает этот вопрос

    мне не особо хочется переписывать свой проект
    и нэйм спэйс реализован частично

    и вот так
    namespace => path to module

    не понял как такое namespace + classname => path to module вообще может работать если в папке несколько классов с одинаковым нэймспэйсом?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Include внутри класса - как происходит инклюд интепретат

    конечно. classname у них разный, имя файла видимо тоже, почему не сможет?
     
  9. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Re: Include внутри класса - как происходит инклюд интепретат

    а... все понял...
    вот только нужен ли нэймспэйс для модулей?
    как бы имена классов там начинаются со слова module_имямодуля
    и собственно одинаковых папок создать не получится в любом случае
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Include внутри класса - как происходит инклюд интепретат

    Я считаю неймспейсы уже победили и стесняться их не надо. Ты делай как тебе заблагорассудится.