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

+0

Какую версию PHP вы используете? Я думаю, что это возможно с 5,5. –

+0

Посмотрите на функцию call_user_func_array. Это может помочь. –

ответ

0

То, что эти линии делают:

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

является $dbh назначена на функцию, а затем вы передаете $dbInfos к нему. Хотя то, что вы пытаетесь сделать, это вызвать функцию dbh с параметрами $dbInfos класса IOC, который на самом деле не существует. См. Разницу здесь. Именно поэтому вы получаете неопределенную ошибку вызова.

Если вы действительно хотите сделать это, попробуйте создать функцию в IOC классе, а затем продолжить с тем, что вы делаете, т.е. $dbh = $ioc->dbh($dbInfos); ..

Я надеюсь, что это помогает ..

+0

Это определенно помогает! В самом деле, что на самом деле не имеет смысла, это то, что я пытаюсь сделать. Магическая функция __get() работает с экземпляром класса, а не с функцией. – user2705463

Смежные вопросы