Создать функцию с именем из переменной помогите

igrok54

Ищущий
Как правильно реализовать примерно это:
PHP:
$a='aaa';
function $a() {
    echo 'Hello!';
}
$a();
Делаю в своей CMS возможность создавать произвольное количество html-блоков, в базе имеем массив блоков, каждый состоит из:
имя функции, заголовок блока, содержимое блока
Шаблонизатор должен, считав базу, в цикле создать новые функции с указанными именем и соответствующим содержанием, а на сайте эти созданные функции могут быть затребованы в произвольном порядке, не в том, в котором они прописаны в базе, могут вообще перемежаться с другими блоками...
+ php 5.2
 

igrok54

Ищущий
Функция затем должна быть доступна в любом месте шаблонизатора в виде функции, а не в виде переменной. Так что $a не нужна, нужна $a()
 

radioheaded

PHP нуб
Функция затем должна быть доступна в любом месте шаблонизатора в виде функции, а не в виде переменной. Так что $a не нужна, нужна $a()
Там в моем примере внутри можно обратить внимание на ссылку и даже сходить по ней, если лень просто взять и проверить приведенный код.

И еще нескромный вопрос: а зачем это, да еще и в шаблонизаторе?
 

igrok54

Ищущий
По вашей ссылке я ходил, но не увидел там подходящего варианта. Дополнительное ограничение еще в том, что создаваемая функция не может иметь передаваемых параметров. :(
Т.Е. не может быть $a($b), а только $a().
А по поводу зачем в шаблонизаторе:
PHP:
// Основная функция для построения затребованного бара
// Бар в темплейте выводится конструкцией:
// display('leftbar');   или    display('rightbar');
//
*/
function display($bar,$starttag='<li>',$endtag='</li>') {
	$shabstr=file(FILE_TPL_CONF);  // - Считывается порядок затребованных в баре блоков из конфига (пример: leftbar:menu,poll,rss...
	for($i=0;$i<count($shabstr);$i++) {
		$str=trim($shabstr[$i]);
		if(!empty($str)) {
			list($place,$blocks)=explode(RAZDELITEL,$str);
			$blocks=trim($blocks);
			{$regpl[]=$place;}
			$allbls[$place] = explode(",", $blocks);
			$$place=$allbls[$place];
		}
	}
	if(isset($$bar)) {			// Если существует массив для затребованого бара, (menu,poll,rss)
	$bararr=$$bar;
		if($starttag==='<li>') {echo '<ul>';}
		for($i=0;$i<count($bararr);$i++) {
			if(function_exists($bararr[$i])) {
				echo $starttag;
				$bararr[$i]();          // ВОТ ОНО. Можно конечно дописывать elseif...
				echo $endtag;
				if(DEBAG_LOG==='1') {debag_str($bararr[$i]);}
			}
		}
		if($starttag==='<li>') {echo '</ul>';}
	}
}
 

radioheaded

PHP нуб
Какой ужас...

По поводу параметров
PHP:
$a = function($p1, $p2, $p3) { return $p1 + $p2 - $p3; }
Использовать разыменование — моветон. Да оно вам тут и не нужно. Вместо функций menu(), poll() и т.д. используйте параметры 'menu', 'poll', ... и по ним определяйте, что нужно сделать.
И я так и не понял, где тут нужно динамически создавать функции? В чем необходимость и что там будет внутри?
 

igrok54

Ищущий
Внутри может инклюдиться другой файл, может обрабатываться и выводится массив и т.д..
 

radioheaded

PHP нуб
Так что мешает заранее определить эту функцию? Зачем делать это динамически?
 

igrok54

Ищущий
Основные функции и определены заранее. Да вот потребовалась возможность создавать произвольные блоки из админки - и вот тут я и повис с динамическим созданием произвольных функций, которые бы затем обрабатывались этим шаблонизатором...
 

radioheaded

PHP нуб
Ну так создавайте произвольные блоки, в чем проблема. Динамическое создание функций при этом не нужно.

Если вам нужно создавать блоки кода, то у вас проблемы с архитектурой.

В общем, на вопрос топика вы ответ получили. Это уже оффтоп. Все равно, думаю, бессмысленно убеждать вас в том, что вы все делаете неправильно.
 

hell0w0rd

Продвинутый новичок
А если вам нужно будет атрибут добавить? будете писать
PHP:
display('bla','<a href="/blabla">', '</a>')
откройте для себя twig
 
Сверху