[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Область видимости функций с динамическими именами
tiosteel
здравствуйте, я попытался написать небольшую обертку к создаваемой структуре, ради интереса решил сделать динамические имена функций для того, чтобы они точно не пересеклись с именами уже существующих
проблема в том, что созданная таким образом функция не видит у себя в теле другие функции, созданные аналогично
все созданные переменные типа "функция" объявлены глобальными
код объявления переменных (файл 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 написал(а):
Мсье знает толк в извращениях rolleyes.gif
если уж юзаешь 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
хотя как это применить к твоему коду - не могу так сразу сказать.. да и не за чем это, ведь есть нормальная альтернатива в виде нэймспейсов
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.