2014-09-06 82 views
0

我試圖直接調用返回的函數並傳遞一個參數,但似乎我必須在兩次中完成它。如何在php中直接調用返回的匿名函數

這是我的代碼:

<?php 
    $signup_db = $configOptions['db']['signup_db']; 

    // setup the infos of the db connection in an object 
    $dbInfos = new DBInfos(); 
    $dbInfos->setEngine($signup_db['engine']); 
    $dbInfos->setHost($signup_db['host']); 
    $dbInfos->setDbName($signup_db['dbname']); 
    $dbInfos->setUser($signup_db['user']); 
    $dbInfos->setPassword($signup_db['password']); 

    // create the Inversion of Control object for dependency injection. 
    $ioc = new IOC(); 

    // create a new database connection with a PDO object. 
    $ioc->dbh = function($dbInfos) { 
     try { 
      PDOconfig::setDbInfos($dbInfos); 
      $dbh = new PDOconfig(); 
      $dbh->setAttribute(PDO::ATTR_PERSISTENT, true); 
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch (Exception $e) { 
      echo "Error!: " . $e->getMessage() . "<br/>"; 
     } 
     return $dbh; 
    }; 

    $dbh = $ioc->dbh; 
    $dbh = $dbh($dbInfos); 

    // default page if empty. 
    if (empty($_GET)) { 
     $_GET["page"] = "home"; 
    } 
    if (isset($_GET["page"])) { 
     $page = $_GET["page"]; 
     $variables = array("page" => $page, 
          "ioc" => $ioc); 

     if ($page == "home") { 
      renderLayoutWithContentFile("home.php", $variables);    
     } else if ($page == "contact") { 
      renderLayoutWithContentFile("contact.php", $variables); 
     } else if ($page == "about") { 
      renderLayoutWithContentFile("about.php", $variables); 
     } 
    } 
?> 

這是國際奧委會類:

<?php 

// Inversion of control with magic methods 
// its pupose is to serve as a container for dependency injection 
class IOC { 
    private $registry = array(); 

    public function __set($name, $resolver) { 
     $this->registry[$name] = $resolver; 
    } 

    public function __get($name) { 
     return $this->registry[$name]; 
    } 
} 

?> 

我想改變這一點:通過代碼這一獨特的行

$dbh = $ioc->dbh; 
$dbh = $dbh($dbInfos); 

$dbh = $ioc->dbh($dbInfos); 

但我有一個錯誤,如果我這樣做:

Fatal error: Call to undefined method IOC::dbh() in domain.com/public/index.php on line 34 

這沒有什麼意義,我。 有人知道如何處理這個問題嗎?

+0

(PHP經常不這是有道理的,它的實現非常糟糕,它與創建和對象相同,並在同一行中調用一個方法)您可以縮小范例,讓每個人都可以重現它。 – idmean 2014-09-06 21:02:07

+0

您使用哪個PHP版本?我認爲這是可能的,因爲5.5。 – 2014-09-06 21:23:15

+0

查看call_user_func_array函數。它可能有幫助。 – 2014-09-06 21:24:56

回答

0

什麼,這些線路都在做:

$dbh = $ioc->dbh; 
$dbh = $dbh($dbInfos); 

$dbh被分配給一個函數,然後您傳遞$dbInfos它。雖然你試圖做的是調用dbh函數這實際上不存在的參數$dbInfos。看到這裏的區別..這就是爲什麼你得到未定義的調用錯誤。

如果你真的想這樣做,嘗試創建一個功能IOC類,然後用你在做什麼,即$dbh = $ioc->dbh($dbInfos);繼續..

我希望這有助於..

+0

它絕對有幫助!事實上,實際上沒有意義的是我想要做的。魔術函數__get()適用於類實例,不適用於函數。 – user2705463 2014-09-06 21:51:00