[PHP] не видно константы при require

Biglem

такая конструкция:
файл 1.php:
define('FOO', 'BAR');
файл 2.php:
require '1.php';
echo "FOO".FOO;
файл 3.php:
require '2.php';
echo "FOO".FOO;
открываем в браузере файл 3.php и видим:
FOOBAR
FOOFOO
а хочется:
FOOBAR
FOOBAR
почему так?
как с этим справиться?

Biglem

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

uncle17

ну так дай свое "то же самое"

Fragaria

проверь, может есть файлы, которые имеют такие же имена только находятся в другом каталоге (уровнем выше, например и ты случайно не тот файл инклудишь?
А ещё - такой эффект замечается при запуске отладки с помощью Zend 5

Biglem

вот так примерно выглядит:
config\constants_VR32.php:
<?
define('FOO', 'BAR');
?>
js_lite.php:
<?
$filename = $_GET['filename'];
if (empty($filename {
$filename = '';
}
require 'config/constants_' . $filename . '.php';
echo "<>";
?>
VR32.php:
<?
preg_match("/(.*\/)[^\/]*$/", $_SERVER[PHP_SELF], $match);
$incl_file = "http://$_SERVER[SERVER_NAME]$match[1]" . 'js_lite.php';
echo "<>";
require $incl_file . "?filename=VR32";
echo "<>\r\n";
echo "<>";
?>
вызывается файл VR32.php
в коде выглядит так:
<>
куча javascript
<>
<>
<>

Fragaria

потому что нельзя с помощью require передать GET-запрос скрипту

Fragaria

echo "<>";
require $incl_file . "?filename=VR32";
echo "<>\r\n";

Biglem

но это противоречит тому, что выводит скрипт

Biglem

для большей убедительности добавим после:
require 'config/constants_' . $filename . '.php';
строку:
echo "<>";
получим:
<>
значит все передается
я щас с ума сойду
хуйня полная какая-то получается

Fragaria

какой-то бред.
require всего-навсего помещает код из указанного файла вместо себя. Как тут могут передаваться какие-то переменные?

Biglem

значит не совсем просто
сам попробуй

Fragaria

а-а-а-а, всё ясно
у тебя включены URL_fopen_wrappers, и require ты делаешь не так:
require ("../includes/a.php");
а вот так:
require ("http://myhost.com/includes/a.php?foo=bar");
поэтому скрипт http://myhost.com/includes/a.php?foo=bar выполняетя отдельно (в своей variable scope) и для него соответствующим образом вытаскиваются переменные из URL.
попробуй инклудить с помощью абсолютного пути, всё будет нормально

Biglem

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

Biglem

тьфу ты
заговорился
наоборот
получается, нужно использовать относительный?

uncle17

именно
З.Ы. Как раз год назад проблема была - пытался инклудить файл с другой машины, ессно, по абсолютному. В форумах меня обсмеяли и объяснили разницу между файловой системой и http

Fragaria

тут разница не в относительном и абсолютном пути
а в разнице между инклудом через wrapper (по протоколу ftp или http например, require ("http://myhost.com/a.php") и прямым инклудом с указанием абсолютного или относительного пути в файловой системе, например, require ("/var/www/includes/a.php") или require ("../includes/a.php"). А передавать переменные скрипту, который инклудишь, GET'ом - это изврат. Почитай про variable scope при require и include.

Biglem

спасибо
понял
а вот объясниет мне, зачем это сделано так?
чтобы программисты слишком быстро не программировали?

uncle17

чтоб порнуху воровать сложнее было
Оставить комментарий
Имя или ник:
Комментарий: