Reputation: 2632
I'm trying to create functions dynamically with eval()
. But I get this warning: Notice: Use of undefined constant
Any suggestion?
$funcs = array('func_a', 'func_b', 'func_c');
foreach($funcs as $func_name) {
eval( 'function ' . $func_name . '() {
mainfunc(' . $func_name . ');
}'
);
}
func_a();
func_b();
func_c();
function mainfunc($func_name) {
echo $func_name . '<br />';
}
Assuming the array $func
is an option value stored in a database and I need the function names for a callback function in a separate part of the script. So creating anonymous functions with create_function()
is not what I'm looking for.
Thanks for your info.
Upvotes: 3
Views: 1767
Reputation: 2632
For those who were wondering what I was talking about, here is the sample WordPress plugin which demonstrates how dynamic function creation comes handy.
/* Plugin Name: Sample Action Hooks with Dynamic Functions */
// assuming this is an option retrieved from the database
$oActions = array( 'a' => array('interval' => 10, 'value' => 'hi'),
'b' => array('interval' => 30, 'value' => 'hello'),
'c' => array('interval' => 60, 'value' => 'bye')
);
add_action('init', LoadEvents);
function LoadEvents() {
global $oActions;
foreach($oActions as $strActionName => $array) {
eval( 'function ' . $strActionName . '() {
SampleEvents(\'' . $strActionName . '\');
}'
);
add_action('sampletask_' . md5($strActionName), $strActionName);
if (!wp_next_scheduled( 'sampletask_' . md5($strActionName)))
wp_schedule_single_event(time() + $oActions[$strActionName]['interval'], 'sampletask_' . md5($strActionName));
}
}
function SampleEvents($strActionName) {
global $oActions;
// just log for a demo
$file = __DIR__ . '/log.html';
$current = date('l jS \of F Y h:i:s A') . ': ' . $strActionName . ', ' . $oActions[$strActionName]['value'] . '<br />' . PHP_EOL;
file_put_contents($file, $current, FILE_APPEND);
wp_schedule_single_event(time() + $oActions[$strActionName]['interval'], 'sampletask_' . md5($strActionName));
}
And the same functionality could be achieved with __call()
.
/* Plugin Name: Sample Action Hooks */
add_action('init', create_function( '', '$oSampleEvents = new SampleEvents;' ));
class SampleEvents {
public $oActions = array( 'a' => array('interval' => 10, 'value' => 'hi'),
'b' => array('interval' => 30, 'value' => 'hello'),
'c' => array('interval' => 60, 'value' => 'bye')
);
function __construct() {
foreach($this->oActions as $strActionName => $arrAction) {
add_action('sampletask_' . md5($strActionName), array(&$this, $strActionName));
if (!wp_next_scheduled( 'sampletask_' . md5($strActionName)))
wp_schedule_single_event(time() + $this->oActions[$strActionName]['interval'], 'sampletask_' . md5($strActionName));
}
}
function __call($strMethodName, $arguments) {
// just log for a demo
$file = __DIR__ . '/log.html';
$current = date('l jS \of F Y h:i:s A') . ': ' . $strMethodName . ', ' . $this->oActions[$strMethodName]['value'] . '<br />' . PHP_EOL;
file_put_contents($file, $current, FILE_APPEND);
wp_schedule_single_event(time() + $this->oActions[$strMethodName]['interval'], 'sampletask_' . md5($strMethodName));
}
}
Upvotes: 0
Reputation: 43552
Use better approach than eval(), it is called overloading.
Example:
class MainFunc {
public function __call($name, $arguments)
{
echo "_call($name)<br>";
}
public static function __callStatic($name, $arguments)
{
echo "_callStatic($name)<br>";
}
}
# php >= 5.4.x
(new MainFunc)->func_a();
(new MainFunc)->func_b("param", "param2");
# or php < 5.4
$mainFunc = new MainFunc;
$mainFunc->func_a();
$mainFunc->func_b("param", "param2");
MainFunc::func_a_static();
MainFunc::func_b_static("param", "param2");
Output is:
_call(func_a)
_call(func_b)
_callStatic(func_a_static)
_callStatic(func_b_static)
Upvotes: 4
Reputation: 17477
Your eval body needs to read:
mainfunc(\'' . $func_name . '\');
Without the single quotes, eval() makes code that has an unquoted literal--an undefined constant.
Upvotes: 2