2016-12-14 12 views
0

これはおそらく基本的なものですが、私は熟練した開発者ではありません。PHPのクラスのグローバルインスタンス

私の質問は:私はどのように関数呼び出しの外でそれを初期化することができますが、それでも内部で使用できるように、 "グローバル" PHPでクラスを取得できますか?

この例は、私が達成したいものを示しているが、明らかに動作しません:

$view = new Smarty(); 

$view->debugging = false; 
$view->caching = false; 
$view->cache_lifetime = 1; 
$view->setTemplateDir('../views/'); 

$app->get('/register', function (Request $request, Response $response) {  
    $param = $request->getParams(); 

    $view->assign('name', $param["name"]); 
    $response = $view->display('index.html'); 

    return $response; 
}); 

を、それは私が$ APP-以内にそれを定義する必要が動作するように取得するには>を呼び出します。もちろん、$ app-> get呼び出しの中で$ view-> debuggingなども設定しなければなりません。

この目的は、すべての呼び出しで$ viewの新しいインスタンスを初期化し、デフォルト設定をグローバルにする必要を回避することです。

編集: 多分私はここで質問していたかもしれません。 Googleの検索後、私は解決策を見つけるかもしれないと思う。しかし、関数内で "global $ view"を使用すると、クラスのインスタンスにアクセスできます。これは "public $ variable = new class.function()"を設定した他の言語とは異なりますが、おそらくそれが理由であり、これがセキュリティ/パフォーマンスなどの面でどのような利点があるかは間違いありません。何か別の方法がありますか?プロ/コンサは何ですか?クロージャのスコープ内の変数を変更できるようにするには、参照することにより、使用(すなわちuse (&$view))を呼び出すことができます

$app->get('/register', function (Request $request, Response $response) 
    use ($view) { 
    // ... code ... $view is defined here 
} 

答えて

2

グローバル変数の使用は適切な方法ではありません。それはテストすることが非常に困難なコードになります。もちろん

function doSomething($obj) 
{ 
    // code here 
} 

$foo = new MyClass(); 
doSomething($foo); 

、あなたが潜在的に独断フレームワークで作業しているとき、トリッキーなことができます:あなたは通常、依存性注入をしたいWhy is Global State so Evil?参照してください。

あなたのケースでは、よりよい解決策はのように、代わりにグローバルスコープのローカルスコープから変数を継承するthe use keywordを使用することです:

$app->get('/register', function (Request $request, Response $response) use ($view) { 
    $param = $request->getParams(); 

    $view->assign('name', $param["name"]); 
    $response = $view->display('index.html'); 

    return $response; 
}); 

あなたはグローバルを使用する必要がある場合は、単に使用globalキーワード:

$app->get('/register', function (Request $request, Response $response) {  
    global $view; 
    $param = $request->getParams(); 

    $view->assign('name', $param["name"]); 
    $response = $view->display('index.html'); 

    return $response; 
}); 
関連する問題