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
と、check が実行されず、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.'); });
- もしそうなら、この呼び出しはどのスコープで行われていますか? PHP のクロージャーのスコープ、または call_user_func は、クロージャーを介して渡されるため、Route クラスのスコープ内でそれを呼び出しますか? (もう少し明確にするために、PHPのスコープはそうかもしれません
$route->get
が、クロージャースコープは使用するかもしれません$this->get
) - var_dump/print_r のような Closure オブジェクトをダンプして内容を確認する方法はありますか?
短いガイダンスが私を動かします。私は PHP を知っていますが、クロージャーを使用することは私にとってかなり新しいことです。
どうもありがとうございました。返信に感謝します。