【发布时间】:2014-09-06 20:52:27
【问题描述】:
我正在尝试直接调用返回的函数并传递一个参数,但似乎我必须分两次这样做。
这是我的代码:
<?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
这对我来说没有意义。 有人知道如何处理吗?
【问题讨论】:
-
(PHP 通常没有意义。它只是实现得很糟糕。在同一行中创建对象和调用方法也是如此)您能否缩小示例范围,以便每个人都可以复制它。
-
您使用的是哪个 PHP 版本?我认为从 5.5 开始就有可能。
-
看看 call_user_func_array 函数。这可能会有所帮助。
-
@Charlotte Dunois:我使用 PHP 5.3.26。我会尝试 5.5
-
@Petr Jirouš:看起来很有希望。
标签: php dependencies callable