Эта тема на forum.dklab.ru


MeisterKhan: Вопрос о include/require
Господа, есть проблема.
Хочу написать функцию, которой нужно указывать имя файла, что бы она его потом загрузила и можно было работать с данными этого файла, но у меня не получаетца.
Пример:
Скажем, есть файл index.php и есть языковый файл errors.phр. Например в Index.php делаетца обработка какой-то ошибки, и в случае этой ошибки должно вываливатся сообщение из errors.php. Примерно таким макаром:

require_once('load.php'); // loadLanguage

function some_error() {
....
loadLanguage('errors');
echo "$txt['db_error']";
....
}


По поводу "неполучается".
Пхп выдает Notice, мол, undefined index 'db_error' - для примера.

Подскажите как можно сделать это дело, и если можно - то готовый код. Пасиба.
Programmer:
мол, undefined index 'db_error' - для примера.

в массиве нет элемента db_error.

а насчет функции, то можно применить следущий пример:


class get_file
{
function get_files($file)
{
if(is_array($file)){
foreach($file as $key => $value){
if(file_exists($value)){
return dirname(__FILE__) . '\\' . $value;
} else {
return false;
}
}
} else {
return dirname(__FILE__) . '\\' . $file;
}
}
}

try {
$file_array = array(
'index.php'
);
$get_file = new get_file($file_array);
$files = $get_file->get_files($file_array);
if($files == false)
throw new Exception();
else
print($files);
}
catch(Exception $e) {
print('<br /><b>Special error</b>: Can not load file');
}


только при возвращении результата в функции используйте конструкцию return require_once(...);
MeisterKhan:
А можно пример немножко по проще и по удобнее? :)) что бы просто - "loadLanguage('errors')" и все дела. :)
MeisterKhan:
P.S. Пример неработает.
Алексей С.:
код функции loadLanguage('errors') в студию
Ksnk:
Вот - errors.php<?php
$txt=array('db_errors'=>'Yea!!');
function txts($s) {
global $txt;
return $txt[$s] ;
}
function txt2($s) {
return 'error # '.$s ;
}
?>/ а вот собственно тест
<?php
function FindFile($s) {
return $s.'.php' ;
}
function loadLanguage($s) {
require_once (FindFile($s));
}
/*************************************************/
// require_once(FindFile('errors')); // так - работает!
loadLanguage('errors'); // так - не работает!
echo $txt['db_errors']." ".txts('db_errors')." ".txt2('db_errors');
?>
Поймал себя на мысли, что иногда в языке не хватает С-шных define'оф :)))
Интересно, что, во втором случае, если в errors.php описаны функции, то они будут исправно видны снаружи, Зато переменные полностью пропадают... Причуды области видимости переменных, однако!!!
Алексей С.:
ужас.
я не понимаю всего этого огорода с функциями.
что мешает:
если уж так хочется в errors.php просто писать массив $txt
и подключать этот файл.

а потом к нему ображаться echo $txt['db_errors']?
зачем все эти FindFile,LoadLanguage,txts?

Зато переменные полностью пропадают... бред. так не бывает
Ksnk:
Поправил ранее опубликованый пример для повышения его самочевидности ;)
Вывод этого примера представляет собой

Notice: Undefined variable: txt in q:\site\public_html\test\req.php on line 11
[Денвер: показать возможную причину ошибки] error # db_errors

Алексей С.:
не могу сейчас проверить.
без сервака сижу.
незнаю. загоните эту txt в массив GLOBALS , или передайте в функция параметром.
Ksnk:
Алексей С.
В этом примере иллюстрируется поведение PHP при include'е, выполненном в теле процедуры... И не более того.
Anonymous:
А если в эту ФайндФайл функцию добавить global $txt; ?
Ksnk:
А если в эту ФайндФайл функцию добавить global $txt; ?
И что? Полагаете должно помочь? У меня - не помогло :( В том смысле, что сообщение об ошибке Денвером теперь не выдается, а значение переменной $txt теперь пусто.
Programmer:
loadLanguage - процедура. и подгрузка файла идет в процедуру. выходом из положения будет вариант
function FindFile($s) {
return $s.'.php' ;
}
function loadLanguage($s) {
return require_once (FindFile($s));
}
Programmer:
а по поводу того, что мой пример "не работает" - это скорее всего из-за вашей версии php. мой пример для php5
тем более мой пример позволяет подгружать сразу несколько файлов. ваш лишь один. к тому же - зачем эта путаница с вашими функциями?
Ksnk:
Возможно, что дело действительно в верcии PHP. У меня - штатная версия от Денвера - PHP Version 4.3.10. В ней includ'ы внутри тела процедуры обрабатываются тем "экзотическим" способом, который я попытался описать. Возможно это поправлено в 5-й версии, у меня проверить пока нет возможности :(.
С другой стороны, с позиции общей идеологии языка - include - это просто вставка текста из другого файла и с этих позиций, описания переменных внутри тела процедуры там и должны были потеряться, как кстати и описания новых функций.
Дмитрий Котеров:
Нет, функции в PHP всегда создаются глобальными. А переменные - конечно же, локальны. Если хотите сделать их глобальными во включаемом файле, используйте либо $GLOBALS, либо инструкцию global. Так было во всех версиях PHP и, вероятно, так и останется.
Ksnk:
Дмитрий Котеров
Да! Действительно, не причуды, а совсем даже RTFM :)
если в первой строчке моего errors.php написать $GLOBALS["txt"]=array('db_errors'=>'Yea!!');, то все исправно работает.
2 MeisterKhan
Помогло?
2ko:
1. пример, то что приводился для php5
2. сделать require или include из-под функции нельзя.
Because this is a language construct and not a function, it cannot be called using variable functions
3. выход - только грузить в Globals


function LoadError($file=null,$req) {
if(is_readable($file)) {
require($file);
$GLOBALS['loaded_errors'] = eval("\$".$req); // $errors находится в файле $file. $errors = array('001'=>'error 00000001 :)');
} else {
return false;
}
}


ну, или просто return $errors; //если знаем что ищем
amikhailov:
сделать require или include из-под функции нельзя

допустим нам надо инклюдить файл с именем file.php
делаем так (у меня все работает: PHP5):

function loadfile() {
eval("require('file.php');");
}

Эта тема на forum.dklab.ru