如何在php中直接调用返回的匿名函数
问题描述:
我试图直接调用返回的函数并传递一个参数,但似乎我必须在两次中完成它。如何在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
这没有什么意义,我。 有人知道如何处理这个问题吗?
答
什么,这些线路都在做:
$dbh = $ioc->dbh;
$dbh = $dbh($dbInfos);
是$dbh
被分配给一个函数,然后您传递$dbInfos
它。虽然你试图做的是调用dbh
函数这实际上不存在的参数$dbInfos
。看到这里的区别..这就是为什么你得到未定义的调用错误。
如果你真的想这样做,尝试创建一个功能IOC
类,然后用你在做什么,即$dbh = $ioc->dbh($dbInfos);
继续..
我希望这有助于..
+0
它绝对有帮助!事实上,实际上没有意义的是我想要做的。魔术函数__get()适用于类实例,不适用于函数。 – user2705463 2014-09-06 21:51:00
(PHP经常不这是有道理的,它的实现非常糟糕,它与创建和对象相同,并在同一行中调用一个方法)您可以缩小范例,让每个人都可以重现它。 – idmean 2014-09-06 21:02:07
您使用哪个PHP版本?我认为这是可能的,因为5.5。 – 2014-09-06 21:23:15
查看call_user_func_array函数。它可能有帮助。 – 2014-09-06 21:24:56