2016-04-19 4 views
-1

いくつかのサンプルコードから始めたので、なぜこれらのシナリオがすべて機能しないのか分かりません。私はそれが使用 '部分に失敗した私の大規模なプログラムにスクリプトの内容をインライン化すると、コマンドラインサンプルコードを関数に入れると、なぜphp 'use'が失敗するのですか?

<?php 
//Script in standalone file: script.php 

//...define some stuff 
require REQUIRED_FILE; 
use Aws\Ses\SesClient; 
//now do some stuff 
?> 

から実行すると、ファイルscript.php呼ば

スクリプトの例のコードが正常に動作します。

<?php 
//class-of-bigger-program.php 

//function called from some other part of program 
function foo(){ 
    //paste the contents of the same script above 
    //...define some stuff 
    require REQUIRED_FILE; 
    use Aws\Ses\SesClient;//CRASH HERE 
    // now do some stuff 
} 
?> 

しかし、その大きなプログラムの同じ場所にスクリプトを含めるとうまくいきます。

<?php 
//function called from some other part of program 
function foo(){ 
    //paste the contents of the same script above 
    include 'script.php'; 
} 
?> 

なぜこの場合ですか?私はちょうど '使用'コマンドを使用して逃していますか? 私は 'use'と 'include'と名前空間の違いを理解するのが難しいことを発見しました。

+1

なぜ機能に使用を追加しますか?あなたの 'class-of-largerer-program.php'が本当にクラスであれば、あなたは ' require REQUIRED_FILEです。 Aws \ Ses \ SesClientを使用します。クラスYourClass {...} ' どのエラーが表示されますか? – olibiaz

+0

エラーがあっても白い画面が表示される error_reporting(E_ALL);ini_set( 'display_errors'、true); 私は関数の途中でrequireを呼び出すべきではないと言って正しいですか?クラスのトップでのみ? – Chris

+0

はいFred-ii-そこに引用符があります - それを表示するために投稿を編集しました。 – Chris

答えて

1

なぜ機能に使用を追加しますか?あなたのclass-of-bigger-program.phpが本当にクラスである場合は、実行する必要があります。

require REQUIRED_FILE; 
use Aws\Ses\SesClient; 

class YourClass {...} 
+0

これは初心者のPHPエラーだと思います。関数内で 'use'を使用できない/使用すべきではないことを知りませんでしたが、クラスの先頭にすべきです。 – Chris

+1

あなたは今朝より多くの知識で眠りにつきます;)それは良いことです。 – olibiaz

2

The PHP documentationはあなたのために非常にうまくこれを説明します。 なぜあなたは何かをすることができないを知っていることは、あなたが知ることができないことがしばしばはるかに有用です。

useキーワードは、ファイルの最も外側のスコープ(グローバルスコープ)または内部の名前空間宣言で宣言する必要があります。これは、インポートは実行時ではなくコンパイル時に行われるため、スコープをブロックすることはできません。

つまり、プログラムを実行する前に他のコードをインポートするため、プログラムの最も外側のレベルにある必要があります。

関連する問題