我创建了一个基本类来使用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();
});
如果你在上面检查过,这是我的问题:
is_callable
检查不会运行,我会收到php fatal error
。是否is_callable
是检查不存在的方法的有效检查?为什么会这样?return "Test";
,我的$closure parameter in get method
是否会包含"Test"
字符串?我可以从闭包内的不同类传递方法吗?像:
Route::get('account', function () {
if(User::isLoggedIn() !== true)
return Error::login_error('Unauthorized.');
});
$route->get
但是关闭范围可能会使用$this->get
)简短的指导将让我前进。我知道PHP,但使用闭包对我来说是一个新手。
非常感谢,感谢您的回复。
答案 0 :(得分: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
param只会在支票中使用,但不会作为$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();
});