проблема в том, что созданная таким образом функция не видит у себя в теле другие функции, созданные аналогично
все созданные переменные типа "функция" объявлены глобальными
код объявления переменных (файл config.php):
<?
$___FUNCNAMES=array('include_component'=>'include_component'.time(),'include_class'=>'include_class'.time(),'log'=>'log'.time());
foreach ($___FUNCNAMES as $___FUNCNAME) global $$___FUNCNAME;
?>
код объявления функций (файл functions.php):
<?
$$___FUNCNAMES['log']=function ($source,$mes,$die=false){
if (!$mes) return;
if (!is_dir($_SERVER['DOCUMENT_ROOT'].'/errors')){
if (!mkdir($_SERVER['DOCUMENT_ROOT'].'/errors')) die ('cannot create "errors" folder');
}
if (!file_exists($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt')){
if (!($log=fopen($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt','w+'))) die ('cannot create log file "log.txt"');
if (!fclose($log)) die ('cannot close log file "log.txt"');
}
$log=fopen($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt','r');
$loginfo=date(DATE_ATOM).': "'.$mes.'" SOURCE:" '.$source.'"';
$loginfo.="\n";
if (filesize($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt')) $loginfo.=fread($log, filesize($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt'));
if (!fclose($log)) die ('cannot close log file "log.txt"');
$log=fopen($_SERVER['DOCUMENT_ROOT'].'/errors/log.txt','w+');
if (!fwrite($log,$loginfo)) die ('cannot write log file "log.txt"');
if (!fclose($log)) die ('cannot close log file "log.txt"');
if ($die) die();
};
$$___FUNCNAMES['log'](__FILE__,'test: this command works correctly',0);
$$___FUNCNAMES['include_component']=function($component){
//next 3 commands output "Function name must be a string in Z:\home\bfg\www\functions.php on line 24"
if (!is_dir($_SERVER['DOCUMENT_ROOT'].'/components')){$$___FUNCNAMES['log'](__FILE__,'cannot find folder with components',1);}
if (!is_dir($_SERVER['DOCUMENT_ROOT'].'/components/'.$component)){$$___FUNCNAMES['log'](__FILE__,'cannot find folder with called component',1);}
if (!file_exists($_SERVER['DOCUMENT_ROOT'].'/components/'.$component.'/'.$component.'.php')){$$___FUNCNAMES['log'](__FILE__,'cannot find component index file',1);}
include_once($_SERVER['DOCUMENT_ROOT'].'/components/'.$component.'/'.$component.'.php');
}
?>
Спустя 2 часа, 17 минут, 2 секунды (31.03.2012 - 13:24) Invis1ble написал(а):
Мсье знает толк в извращениях
если уж юзаешь 5.3 - зачем такой огород городить? открой для себя namespace'ы
насчет ошибки - global надо в ф-цию запихнуть, чтоб был какой-то эффект, не?

если уж юзаешь 5.3 - зачем такой огород городить? открой для себя namespace'ы
насчет ошибки - global надо в ф-цию запихнуть, чтоб был какой-то эффект, не?
Спустя 38 минут, 23 секунды (31.03.2012 - 14:02) tiosteel написал(а):
Цитата (Invis1ble @ 31.03.2012 - 10:24) |
Мсье знает толк в извращениях :rolleyes: если уж юзаешь 5.3 - зачем такой огород городить? открой для себя namespace'ы насчет ошибки - global надо в ф-цию запихнуть, чтоб был какой-то эффект, не? |
ради интереса переделал config.php так:
<?
function globalize($var){global $$var;}
$___FUNCNAMES=array('include_component'=>'include_component'.time(),'include_class'=>'include_class'.time(),'log'=>'log'.time());
foreach ($___FUNCNAMES as $___FUNCNAME) globalize($___FUNCNAME);
?>
результат абсолютно тот же
насчет namespace'ов ты прав, я просто не знал, что в php они есть)
Спустя 28 минут, 29 секунд (31.03.2012 - 14:31) Invis1ble написал(а):
tiosteel
Цитата |
ради интереса переделал config.php так: |
я не это имел в виду, конечно так работать тоже не будет
http://php.net/manual/ru/language.variables.scope.php см. Пример #1
хотя как это применить к твоему коду - не могу так сразу сказать.. да и не за чем это, ведь есть нормальная альтернатива в виде нэймспейсов