2017-12-19 5 views
0

私はComposerを初めて使い、クラス以外のファイルを自動読み込みする方法を理解できません。作者は非クラスファイルを要求して使用します

composer.jsonのfilesアレイにファイルを追加しようとしましたが、composer installを実行していましたが、運がなかったのです。

マイcomposer.jsonは、次のようになります。ここでは

{ 
    "name": "app", 
    "description": "", 
    "require": { 
    "mongodb/mongodb": "^1.2" 
    }, 
    "autoload":{ 
     "files":["src/lib/config.php"] 
    } 
} 

$foo = "Hello"; 

config.phpを、非クラスベースのファイルであり、私はそれを呼ぶだろう場所です:

require_once("vendor/autoload.php"); 

echo $foo; 

上記のエラーはundefined variable: fooです。

ファイルが自動ロードされている可能性があります。間違った名前空間に入っている可能性があります。この場合、どうすればこのファイルを呼び出すことができますか。

+1

これには、クラス定義が含まれていない限り、魔法のようにconfig.phpは含まれません。オートロードはすべてのファイルではなく、クラスで動作します –

答えて

2

私は@MarkBakerコメントに同意しません。実際にはファイルは自動的にロードされますが、そのようなファイルに変数を宣言することは不可能です。あなたはこのconfig.phpファイルに次の関数置く場合例えば

function hello() 
{ 
    echo "hello world"; 
} 

、代わりに$fooを表示しますので、同じようにこのメソッドを呼び出します。

hello(); 

あなたが期待される結果を取得します。

変数が表示されていない理由は、そのファイルが作曲を経由してロードされている方法です。

function composerRequire4b299eb5732a472abef81c6ea06043af($fileIdentifier, $file) 
{ 
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { 
     require $file; 

     $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; 
    } 
} 

あなたがそう定義されたすべての変数はこの方法だけではスコープを持つファイルはメソッド内で必要とされて見ての通り、彼らはしませんので、それがその後に見えるようになります(これがPHPの仕組みです)。

私たちの質問に答えて、これは予想される動作です。 Composerによって自動ロードされたファイルに変数を宣言するべきではありません。同様の機能が必要な場合は、手動でファイルを要求する必要があります。

もちろん、構成ファイルに実際に変数を宣言する必要はありません。設定の配列を返す代わりに、この配列をグローバル変数$config変数(最も簡単な解決法)に割り当てるか、これらの設定を保持するクラスを使用し、このクラスから設定を取得する必要があります(例:Laravelのようなもの)。

+0

これは確かに物事をはっきりさせました。ありがとう! :) – user3284463

関連する問題