グローバル変数が悪であることはよく認識しており、これは後でで扱う問題です。私のコードベースではありませんが、私はいくつかのクリーンアップタスクを割り当てられています。クロージャ内のグローバルスコープからの変数へのアクセス
コードベースをスマートにしようとすると、私はAltoRouterというパッケージを使用して簡単なルーティングを実装することに決めました。以前はそれを使っていました。
ここで、コードベースはグローバルスコープで宣言された大量の変数を使用しています。通常、これらの変数はglobal
キーワードを使用して取得されます。しかし何らかの理由で、私がクロージャの中で作業しているときにはこれは機能しません。
は、この単純なルーティングの例を考えてみましょう:
<?php
require 'vendor/autoload.php';
$router = new AltoRouter();
$router->map('GET', '/shops/[i:id]', function($id) {
$_GET['shop_id'] = $id;
require 'go_to_shop.php';
});
$match = $router->match();
if($match && is_callable($match['target'])) {
call_user_func_array($match['target'], $match['params']);
}
これは、変数を設定し、ファイルを必要とし、私の閉鎖を呼び出します。
これはエラーを生成します。
Fatal error: Call to a member function get() on null in /vagrant/Core/CampaignHandler.php on line 71
は今、これを行うと呼ばれているコードは、以下の(ライン70-71)されています
// Inside a method
global $serviceContainer;
$dispatcher = $serviceContainer->get("dispatcher");
$serviceContainer
は、ファイルを含むによって宣言されています早い段階で:
$serviceContainer = new ServiceContainer();
$serviceContainer->set("dispatcher", new EventDispatcher());
基本的に、クロージャーの内容をcすべてが完璧に機能しますが、閉鎖の内側から実行するとすぐに、グローバルスコープ経由でアクセスされるすべての変数は空になります。なぜか、私には分かりません。
閉鎖時にuse
を使用しようとしましたが、これはどちらも機能しませんでした。
私はほとんど解決策ではなく説明を探しています。
'$ serviceContainer'が宣言されているファイルは関数内に*含まれていますか? – deceze
@deceze、いいえ、それはインクルードされたファイルであり、 '$ serviceContainer'はグローバル変数スコープにあります。 – Repox