2017-12-19 1 views
0

Ich bin neu in Composer und ich kann einfach nicht herausfinden, wie nicht-klassenbasierte Dateien automatisch geladen werden.Composer erfordern und verwenden nicht-class-Datei

Ich habe versucht, die Datei zum files Array in composer.json hinzufügen und dann composer install laufen, aber ich hatte kein Glück.

Mein composer.json wie folgt aussieht:

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

Hier sind die Nicht-Klasse-basierte Datei ist, config.php

$foo = "Hello"; 

Und das ist, wo ich es nennen würde:

require_once("vendor/autoload.php"); 

echo $foo; 

Das obige wirft einen Fehler von undefined variable: foo.

Oder vielleicht die Datei wird automatisch geladen und vielleicht könnte ich im falschen Namespace sein. Wenn dies der Fall ist, wie würde ich diese Datei aufrufen.

+1

Dies wird die config.php für Sie nicht magisch einschließen, außer es enthält eine Klassendefinition; Autoloading funktioniert mit Klassen, nicht mit jeder Datei –

Antwort

2

Ich stimme nicht mit @MarkBaker Kommentar. Tatsächlich wird die Datei automatisch geladen, aber es ist nicht möglich, Variablen in solchen Dateien zu deklarieren.

Zum Beispiel, wenn Sie diese config.php Datei in die folgende Funktion:

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

und stattdessen $foo anzuzeigen Sie diese Methode, wie so nennen:

hello(); 

Sie erwartete Ergebnis erhalten.

Der Grund, warum Variable nicht sichtbar ist, ist die Art und Weise Datei über Composer geladen wird:

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

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

Wie Sie Datei, innerhalb Methode erforderlich ist, um alle definierten Variablen Umfang nur in diesem Verfahren so werden sie nicht danach sichtbar sein (so funktioniert PHP).

Also unsere Frage zu beantworten ist das erwartete Verhalten. Sie sollten keine Variablen in automatisch geladenen Dateien durch Composer deklarieren. Wenn Sie ähnliche Funktionen benötigen, sollten Sie die Datei manuell benötigen.

Natürlich glaube ich nicht, dass Sie Variablen in Konfigurationsdateien wirklich deklarieren sollten. Stattdessen sollten Sie das Array der Einstellungen zurückgeben und dieses Array dann der globalen Variablen $config (einfachste Lösung) zuweisen oder eine Klasse verwenden, die diese Einstellungen enthält und die Konfiguration von dieser Klasse erhält (etwas ähnliches wird beispielsweise in Laravel gemacht).

+0

Das hat sicherlich vieles deutlich gemacht. Vielen Dank! :) – user3284463

Verwandte Themen