2011-08-27 5 views
18

Chciałbym dynamicznie wymienić kilka funkcji za pomocą zmiennych, takich jak to:użyć zmiennej do zdefiniowania funkcji PHP

$thing = 'some_function'; 

function $thing() { 
    echo 'hi!'; 
} 

Wiem, że mogę wezwanie funkcją użyciu zmiennej tak:

$something = 'function_exists'; 

if($something('print_r')) { 
    echo 'Yep'; 
} 

Ale najlepszy przykład nie działa dla mnie.

Wszelkie pomysły?

Używam systemu, który ma moduły. Każdy moduł to pojedynczy skrypt php, który można dodać lub zabrać z określonego folderu.

Każdy moduł potrzebuje nowej funkcji, aby go zainicjować. Zmieniam nazwę pliku, a następnie chcę zapętlić i utworzyć serię funkcji, po jednej dla każdego modułu.

Używam istniejącego systemu i nie mogę przepisać obsługi modułu.

Alternatywą byłoby po prostu napisanie wszystkich funkcji init i ich sztywne kodowanie, ale wraz z rosnącą listą robi się kod - a jeśli moduł zostanie usunięty, zostaną wygenerowane błędy.

+1

http://php.net/manual/en/function.call-user-func.php sprawdź, czy jest to – Sleeperson

+0

Z wyjątkiem tego nie byłoby przydatne. Widzisz, ta funkcja jest statyczna przez cały czas - nie możesz sprawić, żeby funkcja działała inaczej w ten sposób. Cokolwiek ta funkcja zostanie nazwana, ta funkcja będzie działać w ten sam sposób, bez względu na wszystko. Jest to jak wykonywanie funkcji 'hello()', z wyjątkiem nazwanych inaczej w zależności od tego, jak lubisz użytkownika: P. Do takiej funkcji prawdopodobnie uzyskałbyś dostęp za pomocą '$ thing()', czyniąc ją bezużyteczną. Po prostu działaj normalnie. – xfix

+0

Może mógłbyś wyjaśnić, dlaczego próbujesz dynamicznie tworzyć funkcje statyczne? To nie wydaje się bardzo dobry pomysł, ogólnie rzecz biorąc. Może, jeśli wyjaśnisz problem, który próbujesz rozwiązać, ludzie mogą zaproponować ci lepsze rozwiązanie. –

Odpowiedz

18

Co można zrobić, to

$thing = 'some_function'; 
$$thing = function() { 
    echo 'hi'; 
}; 
$some_function(); 

< w PHP 5.3, będziesz musiał użyć create_function zamiast anonymous function z:

// Use this in < 5.3 
$thing = 'some_function'; 
$$thing = create_function('', 
    'echo "hi";' 
); 
$some_function(); 

powiedział, że jest funkcji definiujących z dynamicznymi nazwami to zły pomysł. Zamiast tego utwórz szereg funkcji, do których nawiążesz, lub użyj polimorfizmu.

+1

najszybszy pistolet na zachodzie :) – Mick

+0

Chciałbym wspierać <5.3, więc oznacza to create_function. Ale to wymusza na nazwach funkcji "lambda_1", "lambda_2" itd. Muszę później wywoływać te funkcje za pomocą określonego ciągu znaków. – Mick

+0

@Mick Nie, 'create_function' nie ma nic wspólnego z częścią nazewniczą. Dodano przykład dla php <5.3 do odpowiedzi. Dlaczego nie przechowujesz funkcji w tablicy? – phihag