непонятное поведение include - баг или фича?

vitus

мимо проходил
непонятное поведение include - баг или фича?

PHP Version 4.1.2, замечена засада:

допустим есть две директории (в $DOCUMENT_ROOT):
/lib - хранятся классы модели
/forms - хранятся соответственно формочки - рулилки

структура следующая:
/lib/catalog.php
/lib/company.php
/forms/catalog.php

файл /lib/catalog.php подключает к себе company.php следующим образом:
include_once("company.php");

/forms/catalog.php - руль к каталогу, подцепляет каталог так:
include_once("$libpath/catalog.php");
- всё работает.

возникла необходимость рулить компаниями, создаём
файл
/forms/company.php ...

Упс!, руль каталога перестал работать, /forms/catalog.php прицепил /lib/catalog.php, а /lib/catalog.php прицепил /forms/company.php,

сии грабли, лечатся либо абсолютными путями в инклуде либо разными именами файлов, и то и другое бывает не клёво по разным причинам.
 

tony2001

TeaM PHPClub
потому, что при include ("company.php") PHP понятия не имеет какой из двух company.php в твоем include_path инклудить и инклудит первый найденный.
ИИ, к сожалению, в PHP пока не реализован, в качестве его замены пока следует использовать абсолютные пути.
 

vitus

мимо проходил
тоесть это можно считать фичей ;)

ИИ тут абсолютно ни при чём, достаточно использовать контекст.
 

Фанат

oncle terrible
Команда форума
ЧЕЙ контекст?

-~{}~ 29.09.04 11:28:

сначала мы делаем кашу из инклюдов, потом дергаем из одного другой, а потом удивляемся - почему тупая программа не сообразила - чей контекст мы ИМЕОИ В ВИДУ - ого, кто инклюдит первым, или того, кого инклюдят вторым
 

tony2001

TeaM PHPClub
vitus
нет никакого контекста.
есть include() и два одноименных файла.
 

vitus

мимо проходил
я конечно понимаю, эмоций много, религиозные соображения как-никак :)

но во первых никакой каши из инклюдов нет, всё прозрачно,
а во вторых контекст должен быть, раз допускаются относительные пути.

таки - это фича, не бага, я согласен ;)
 

valyala

Новичок
vitus, можно заставить ПХП работать по-твоему :). Для этого замени все инклюды на такие:
PHP:
include_once(dirname(__FILE__) . '/путь/относительно/текущего/скрипта');
 

vitus

мимо проходил
valyala, спасиб,
в 4-м действительно это один из путей,
помнится в 3-м пришлось отказаться от использования этой валшебственной константы,
как-то не адекватно она себя вела, подробностей не помню за давностью лет :) и прогрессирующим склерозом ;) но кажца какраз путь терялся инклюденого файлуса (не пинаца, - не настаиваю).
 

Фанат

oncle terrible
Команда форума
типчик из тех, у которых все кругом виноваты, кроме их самих.
то константа, то инклюд им не такой.
 

vitus

мимо проходил
;) да, Фанат, ты прав, мне действительно не нравится недокументированное поведение или отсутствие явного описания в документации, в этом я конечно-же провинился.

Я публично каюсь в том что не умею читать не написанное :)
 
Сверху