匿名函数的范围

时间:2017-03-21 17:12:58

标签: php scope anonymous-function

我写了一个带有匿名函数回调的路由器。

示例

.md-button-no-margin {
    margin: 0 !important;
}

对于较小的代码,我想将其移动到数组。

我编写了一个带有以下methdos的Routing类:

$this->getRouter()->addRoute('/login', function() {
    Controller::get('login.php', $this);
});

$this->getRouter()->addRoute('^/activate/([a-zA-Z0-9\-]+)$', function($token) {
    Controller::get('activate.php', $this);
});

我的数组有新类的路由路径:

<?php
    namespace CTN;

    class Routing {
        private $path           = '/';
        private $controller     = NULL;

        public function __construct($path, $controller = NULL) {
            $this->path         = $path;
            $this->controller   = $controller;
        }

        public function getPath() {
            return $this->path;
        }

        public function hasController() {
            return !($this->controller === NULL);
        }

        public function getController() {
            return $this->controller;
        }
    }
?>

我当前的问题是(参见评论),foreach([ new Routing('/login', 'login.php'), new Routing('^/activate/([a-zA-Z0-9\-]+)$', 'activate.php'); ] AS $routing) { // Here, $routing is available $this->getRouter()->addRoute($routing->getPath(), function() { // SCOPE PROBLEM: $routing is no more available if($routing->hasController()) { // Line 60 Controller::get($routing->getController(), $this); } }); } 变量在匿名函数上不可用。

  

致命错误:在第60行的/core/classes/core.class.php中调用null成员函数hasController()

我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以使用&#34;使用&#34;:

来使用父作用域中的变量
$this->getRouter()->addRoute($routing->getPath(), function() use ($routing) {

   // SCOPE PROBLEM: $routing is no more available
    if($routing->hasController()) { // Line 60
        Controller::get($routing->getController(), $this);
    }
});

请参阅:http://php.net/manual/en/functions.anonymous.php,以&#34开头的部分;示例#3从父作用域继承变量&#34;