2014-09-06 104 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