【问题标题】:How to call directly a returned anonymous function in php [duplicate]如何在php中直接调用返回的匿名函数[重复]
【发布时间】: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


【解决方案1】:

这些行在做什么:

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

$dbh 被分配给一个函数,然后你将$dbInfos 传递给它。虽然您正在尝试做的是调用一个函数dbh,其参数$dbInfos 的类IOC 实际上并不存在。在此处查看差异。这就是您收到未定义调用错误的原因。

如果您真的想这样做,请尝试在 IOC 类中创建一个函数,然后继续您正在做的事情,即 $dbh = $ioc-&gt;dbh($dbInfos);..

我希望这会有所帮助..

【讨论】:

  • 绝对有帮助!事实上,实际上没有意义的是我正在尝试做的事情。魔术函数 __get() 适用于类实例,而不适用于函数。
猜你喜欢
  • 2014-09-11
  • 2019-05-04
  • 2013-05-13
  • 2011-12-15
  • 1970-01-01
  • 2017-07-25
  • 2018-07-17
  • 2012-02-23
  • 2015-12-07
相关资源
最近更新 更多