Связь переменных и функций в скрипте php

S_guest

Guest
Связь переменных и функций в скрипте php

Подскажите пожалуйста, как на самом деле завязаны между собой все функции (находящиеся в разных файлах) и переменные в какой либо программе. Очень часто приходится смотреть на скрипты в которых например идёт вызов функции из другого файла (без include и т. д.). И как в этом случае работает ООП в php, кучу литературы прочитал, но там это видимо считается элементарным, поэтому не поясняется. Уважаемые программеры расскажите пожалуйста это, русскими словами???
 

Гравицапа

elbirret elcno
[offtopic]
по русски это называецца - хню вы городите, молодой человек
[/offtopic]

-~{}~ 29.11.06 15:03:

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

-~{}~ 29.11.06 15:03:

И как в этом случае работает ООП в php, кучу литературы прочитал, но там это видимо считается элементарным, поэтому не поясняется.
ооп здесь не причём
 

Turist

Новичок
S_guest Если я правильно понял вопрос, то вас видимо интересует как работает Zend. Вкратце насколько я помню с пользовательскими функциями происходит следующее:
транслятор встретив определение ф-ии преобразует код ф-ии в операционный массив, создаёт структуру zend_function с этим массивом и вставляет её в глобальную таблицу функций (с типом ZEND_USER_FUNCTION).
Соответственно при траслировании скрипта (с множеством вложеных скриптов) в глобальную таблицу функций попадают все определённый функции (в том числе из всех вложений). Когда вы обращаетесь к ф-ии из любого места вашего кода, в принципе не важно где эта функция была определена(я имею ввиду файл), ссылка на неё(на операционный массив) берётся из глобальной таблици по её имени.
Непосредственно в PHP массив имён объявленный ф-ий можно получить с помощью ф-ии get_defined_functions
Почитать более подробно о том как работает Zend машина можно либо на zend.org (если найдёте там толковое описание... дайте ссылку пожалуйста :) ) или в книге Джорджа Шлосснейгла «Профессиональное программирование на PHP» глава 20 (возможно есть и другие источники, но мне они не известны)
 

Alexandre

PHPПенсионер
Turist я так понял, что для построения ZEND_USER_FUNCTION все же интерпретатор должен пройтись по всем файлам (инклудам) в течении данной обработки скрипта, или это делается каким-то своеобразным алгоритмом, например для сеанса и хранится в разделяемой памяти?
 

Turist

Новичок
Alexandre Как мне известно пользовательская глобальная таблица функций заполняется каждый раз при обработке скрипта.
Чуть подробнее далее:
Оговорюсь, что к сожалению я не знаю всех тонкостей и подробностей, но основываясь на книге Шлосснейгла могу сказать следующее.
Обработка PHP скрипта состоит из двух частей - трансляция в промежуточный код и выполнение этого кода. Промежуточный код это подобие байт кода в Java, а Zend Engine - виртуальная машина интерпретирующая этот код.
Обработка скрипта на пальцах происходит так:
1)трансляция главного сценария
2)выполнение главного сценария
если при выполнение вызывается include, require, eval то:
2.1)трансляция файла/кода который вкладывается в сценарий
2.2) его выполнение
возвращение в пункт 2
3) завершение

Регистрация функций происходит на этапе трансляции кода. Данные сохраняются в памяти выделенной на данное конкретное выполнения скрипта, т.е. ни какие сеансы и прочее не учитываются. Трансляция происходит при каждом запросе/выполнение скрипта.

Но необходимо отметить, что для ускорения работы существуют системы кэширования промежуточного кода: Zend Accelerator, ionCube Accelerator, APC.... Сам я их не использовал и ничего конкретного о них сказать не могу.
 

S_guest

Guest
Спасибо, уважаемые коллеги. Вы действительно подтвердили моё представление об этом.
 
Сверху