декларация классов и require/include

zerkms

TDD infected
Команда форума
декларация классов и require/include

есть 2 файла:

a.php:
PHP:
<?php

require 'b.php';

$z = new a();
var_dump($z);

class a extends b {}
b.php:
PHP:
<?php

class b {}
результат запроса /a.php:

Fatal error: Class 'a' not found in /var/www/localhost/htdocs/a.php on line 5

тут первая непонятка. схералиб?

ну ладно. модифицируем a.php так:
PHP:
<?php

$z = new a();
var_dump($z);

class b {}
class a extends b {}
Результат выполнения: object(a)#1 (0) { }
Телнетом:
Код:
zerkms@kms0042 ~/.conky $ telnet kms0042 80
Trying 127.0.0.1...
Connected to kms0042.
Escape character is '^]'.
GET /a.php HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 13 Mar 2009 05:36:38 GMT
Server: Apache
X-Powered-By: PHP/5.2.8-pl2-gentoo
Content-Length: 20
Connection: close
Content-Type: text/html

object(a)#1 (0) {
}
Connection closed by foreign host.
теперь берём добавляем снова require, ожидаем redeclare:
PHP:
<?php

require 'b.php';

$z = new a();
var_dump($z);

class b {}
class a extends b {}
Браузер теперь отдаёт на скачивание файл нулевой длины.
Телнет:
Код:
zerkms@kms0042 ~/.conky $ telnet kms0042 80
Trying 127.0.0.1...
Connected to kms0042.
Escape character is '^]'.
GET /a.php HTTP/1.0

Connection closed by foreign host.
ваши мысли, господа?
 

fixxxer

К.О.
Партнер клуба
>> тут первая непонятка. схералиб?

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

в этом месте при компиляции мы о class b еще ничего не знаем, поскольку понятия не имеем, что там окажется в подключаемом файле, соответственно и class a будучи наследуемым от b на этот момент неопределен.

во втором варианте у нас файл самодостаточен так что и информации хватает.

в третьем случае будет fatal error cannot redeclare, почему твой веб сервер так ведет себя не знаю.

а вообще у меня сишная привычка declare before use, и считаю эту привычку хорошей - каким бы умным ни был компилятор, чем меньше шансов свалиться в режим интерпретации, тем лучше =)
 

zerkms

TDD infected
Команда форума
fixxxer
байткод php файла независим от подключаемых файлов (понятное дело. иначе бы приходилось компилировать целиком все приложение).

в этом месте при компиляции мы о class b еще ничего не знаем, поскольку понятия не имеем, что там окажется в подключаемом файле, соответственно и class a будучи наследуемым от b на этот момент неопределен.
почему тогда не пишет, что не найден класс b для наследования? "костыль" в виде "если у нас есть инклуды - то все декларации делаем в рантайме, а не во время синтаксического разбора"?
 

x-yuri

Новичок
теперь берём добавляем снова require, ожидаем redeclare
у меня выдает

почему тогда не пишет, что не найден класс b для наследования?
думаю, текущий вариант проще реализовать ))

"костыль" в виде "если у нас есть инклуды - то все декларации делаем в рантайме, а не во время синтаксического разбора"?
скорее похоже на "раз b пока определен - сделаем это в runtime"
 
Сверху