Профессиональное программирование на PHP

Страница 460 из 591


478 Глава 20 Устройство РНР и Zend Engine

 opcode 2 — здесь значение переменной $hi передается в регистр 2. Используется операция ZEND_FETCH_R, так как переменная используется только для чтения.

 opcode 3 — операция ZEND_ECHO распечатывает значение регистра 2 (или точнее, отправляет его в систему буферизации вывода). Конструкция echo (и ее псевдоним print) представляют собой операции, встроенные непосредственно в язык РНР, в противоположность функциям, которые необходимо вызывать.

 opcode 4 — вызывается операция ZEND_RETURN, устанавливающая возвращаемое значение сценария в 1. Даже если функция return не вызывается явно, каждый сценарий содержит скрытое возвращаемое значение 1, которое используется, если сценарий завершился без явного вызова return.

Рассмотрим более сложный пример:

<?РНР

$hi = 'hello';

echo strtoupper($hi);

?>

Распечатка промежуточного кода выглядит аналогично:

opnum line opcode opl op2 result

0 2 ZEND_FETCH_W "hi" '0

1 2 ZEND_ASSIGN '0 "hello" '0

2 3 ZEND_FETCH_R "hi" '2

3 3 ZEND_SEND_VAR '2

4 3 ZEND_DO_FCALL "strtoupper" '3

5 3 ZEND_ECHO '3

6 5 ZEND_RETURN 1

Необходимо отметить ряд различий между сценариями.

 opcode 3— операция ZEND_SEND_VAR передает указатель на регистр 2 (переменная $hi) в стек аргументов. Посредством этого стека функция получает свои аргументы. Так как вызванная здесь функция является внутренней функцией (реализованной на С, а не на РНР), ее операция полностью скрыта от РНР. Далее будет показано, как получают аргументы функции пользовательского пространства.

 opcode 4 — операция ZEND_DO_FCALL вызывает функцию strtoupper и указывает, что возвращаемое значение должно быть установлено в регистре 3.

Ниже приведен пример тривиального PHP-сценария, который реализует условную логику:

<?РНР $i = 0;

while($i < 5) { $i++;

}

?>

opnum line opcode opl op2 result

0 2 ZEND_FETCH_W "i" '0

1 2 ZEND_ASSIGN '0 0 '0




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006