0

我创建了一个基本类来稍微玩一下 Closure 对象。我不明白这个应用程序/闭包的行为,所以我想问一些事情。此刻我的头脑很混乱,所以我不知道为什么会运行或为什么不运行。

<?php

class Route
{
     public static $bindings = array();
     public static $dispatch = array();

     public static function bind($bind)
     {
         self::$bindings[] = $bind;
     }

     public static function getAllBindings()
     {
         return (array) self::$bindings;
     }

     public static function get($binding, Closure $dispatch)
     {

         if(in_array($binding, self::$bindings))
         {
             if(is_callable($dispatch))
             {
                 return call_user_func($dispatch);
             }
             else
             {
                 die("Dispatch method is not callable.");
             }
         }
         else
         {
             die("Binding is not found in bindings array.");
         }
     }

     public static function test()
     {
         echo "Test ran!";
     }
 }

基本上,我们绑定绑定(例如 /admin、/account、/profile 等)。然后,我们尝试使用闭包调用方法。

// Let's bind account and admin as available bindings
    Route::bind('account');
    Route::bind('admin');

// Let's try doing a get call with parameter "account"
    Route::get('account', function() { 
         // This is where I'm stuck. See below examples:
         // Route::test();
         // return "test";
         // return "testa";
         // return self::test();
    });

如果您在上面检查过,这是我的问题:

  1. 如果我提供了一个不存在的方法,is_callable检查不会运行并且我得到一个php fatal error. 检查不存在的方法不是is_callable有效的检查吗?为什么会这样?
  2. 如果我return "Test";在闭包中提供,我$closure parameter in get method会包含"Test"字符串吗?
  3. 我可以在闭包内传递来自不同类的方法吗?喜欢:

    Route::get('account', function () {
        if(User::isLoggedIn() !== true)
             return Error::login_error('Unauthorized.');
    });
    
  4. 如果是这样,这个调用是在哪个范围内进行的?PHP 在闭包中的作用域,还是 call_user_func 在 Route 类的作用域内调用它,因为它是通过闭包传递给它的?(为了更清楚一点,PHP 的作用域可以做,$route->get但闭包作用域可以使用$this->get
  5. 有没有办法转储像 var_dump/print_r 这样的闭包对象来查看它的内容?

一个简短的指导会让我继续前进。我知道 PHP,但使用闭包对我来说还是很新鲜的。

非常感谢,感谢您的回复。

4

1 回答 1

1

您不需要该is_callable()检查,因为Closure方法声明中的类型提示已经确保了这一点。你也不需要call_user_func(). 这将为您提供以下get()方法:

 public static function get($binding, Closure $dispatch)
 {

     if(!in_array($binding, self::$bindings))
     {
         die("Binding is not found in bindings array.");
     }

     return $dispatch();
 }

注意:目前该$binding参数仅用于检查,而不是作为$dispatch()我所期望的参数。我看不出有什么理由。你应该重新考虑这部分


我在您的帖子中发现了另一个隐藏的问题:

// Let's try doing a get call with parameter "account"
Route::get('account', function() { 
    // This is where I'm stuck. See below examples:
    // Route::test();
    // return "test";
    // return "testa";
    // return self::test();
});

它应该看起来像:

// Let's try doing a get call with parameter "account"
Route::get('account', function() { 
    // Both should work well:
    // Route::test();
    // .. or 
    // return self::test();
});
于 2013-05-22T07:14:16.730 回答