2014-03-14 57 views
1

我想用動態代碼創建閉包。要做到這一點我寫了下面的代碼: -動態地將代碼傳遞給Closure/Annoymous函數

function generateFunction ($class, $method){ 
    $code = "require_once 'Init.php';"; 
    $code = '$model = new '.$class.'();'; 
    $code .= '$model->'.$method.'();'; 

    return function() use(&$code){ 
     return eval($code); 
    }; 
} 

我知道的eval是邪惡的,但無法找到任何替代呢。

要獲得可變我用下面的代碼的功能: -

$myNewFunction = generateFunction ('svn', 'update'); 

現在我想將它作爲參數傳遞給我的PHP文件來運行該功能。但是這個函數在輸出上具有相同的主體,而我期望它如下所示。

function(){return eval(require_once 'Init.php';$model = new svn(); $model->update())} 

基本上這個需要出現,當我決定整合Jobby

回答

1

基本上當我決定整合Jobby這種需求產生的。

我假設你想要動態地創建回調函數。那麼你的代碼是完全矯枉過正的,也根本不需要eval。您可以通過將此回調作爲回調來獲得相同的結果:

$callback = array(new SVN, 'update'); 

這基本上就是您所有的代碼所做的。雖然區別在於SVN在這裏實例化,而不是在觸發回調時。爲了您的代碼的eval - 免費版本,這會做:

function generateFunction($class, $method) { 
    return function() use ($class, $method) { 
     require_once 'Init.php'; 
     $model = new $class; 
     return $model->$method(); 
    }; 
} 
0

在你的情況下,你不需要使用eval()。您必須將call_user_func(或call_user_func_array)與class_existsmethod_exists結合使用。

require_once 'Init.php'; 
function generateFunction ($class, $method) { 
    if (!class_exists($class)) return false; 
    $model = new $class(); 
    return method_exists($model, $method)? array($model, $method) : false; 
} 

$myNewFunction = generateFunction ('svn', 'update'); 
if ($myNewFunction) call_user_func($myNewFunction); 
1

要完成你的答案,這裏是jobby一個完整的例子:

$jobby = new \Jobby\Jobby(); 

$WebSitesSchedule = new WebSitesSchedule(); 
$WebSitesSchedule->load_all(); 

foreach ($WebSitesSchedule as $WebSiteSchedule) 
{ 
    $Url = $WebSiteSchedule->ScheduleAction.'?'.$WebSiteSchedule->ScheduleParameters; 

    $jobby->add("CmsSchedule_".strval($WebSiteSchedule->ScheduleID), array(
     'command' => generateFunction($Url), 
     'schedule' => $WebSiteSchedule->ScheduleCron, 
     'output' => '/PATH/log/CmsSchedule.log', 
     'enabled' => true, 
     'debug' => true, 
     'recipients' => '[email protected]' 
    )); 
} 

function generateFunction($Url) 
{ 
    return function() use ($Url) 
    { 
     $Result = Proxy::curl_request($Url); 
     if($Result["status"]==="success") 
     { 
      print_r($Result); 
      return TRUE; 
     } 
     else 
     { 
      print_r($Result); 
      return FALSE; 
     } 

    }; 
} 

$jobby->run(); 
相關問題