2016-04-22 9 views
1

Ich bin neu mit diesem Namensraum Sache.PHP-Klasse nicht bei der Verwendung von Namespace

Ich habe 2 Klassen (separate Dateien) in meinem Basisverzeichnis, sagen class1.php und class2.php in einem Verzeichnis src/.

class1.php

namespace \src\utility\Timer; 

class Timer{ 
    public static function somefunction(){ 

    } 
} 

class2.php

namespace \src\utility\Verification; 
use Timer; 

class Verification{ 
    Timer::somefunction(); 
} 

Wenn ich class2.php ausführen, bekomme ich die Fatal error dass

PHP Fatal error: Class 'Timer' not found in path/to/class2.php at line ***

ich irgendwo auf gelesen DAMIT , dass ich dafür Autoloader erstellen muss. Wenn ja, wie gehe ich in die Erstellung ein, und wenn nicht, was ist dann das Problem?

UPDATE

habe ich eine Autoloader das wird require alle benötigten Dateien auf meinem PHP-Skript. So, jetzt würde die class2.php so enden.

namespace \src\utility\Verification; 
require '/path/to/class1.php' 
use Timer; 
//or use src\utility\Timer ... both doesn't work. 

class Verification{ 
    Timer::somefunction(); 
} 

Dies funktioniert auch nicht, und es zeigt, dass die Klasse nicht gefunden wurde. Aber, wenn ich alle namespaces und use 's entferne. Alles funktioniert gut.

+0

Versuchen Sie in Ihrer class2.php mit Verwendung \ src \ Timer \ Timer als Timer; –

+0

@ManinderpreetSingh versucht. Gleicher Fehler. –

+0

Ich denke, dass Sie [Komponist] (http://getcomposer.org) überprüfen sollten. Ein Namespace ist lediglich ein eindeutiger Bezeichner für eine Klasse. PHPs Autoload ist überladen, wenn eine Klasse instanziiert wird, während sie nicht existiert, aber bevor der Vorprozessor einen T_FATAL-Fehler auslöst. Es ist üblich, '' 'durch'/'zu ersetzen und aus einer Ordnerstruktur zu laden (warum der Namespace normalerweise mit einer Verzeichnisstruktur übereinstimmt. – ash

Antwort

1

Sie müssen einen Autoloader implementieren, wie Sie bereits in SO darüber gelesen haben.

könnten Sie überprüfen die automatische Laden von Standard-PSR-4 bei http://www.php-fig.org/psr/psr-4/ und Sie können eine Beispielimplementierung des PSR-4 automatische Laden und ein Beispiel Klassenimplementierung zu handhaben mehrere Namespaces hier https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md sehen.

+0

Ich verstehe das. Ich habe gerade gelesen, dass die Schlüsselwörter 'namespace' und' use' ohne einen Autoloader irgendwie nutzlos sind. –

+1

Namespaces sind nur eine Möglichkeit, Elemente zu kapseln Die Ärzte sagen – Andreas

5

Wir können den Namespace Problem auf zwei Arten lösen

1) We can just use namespace and require

2) We can use Composer and work with the autoloading!

Der erste Weg (Namespace und erfordern) Art und Weise

Class1.php (Timer Class)

namespace Utility; 

class Timer 
    { 
    public static function {} 
    } 

Class2.php (Verification Class)

namespace Utility; 
require "Class1.php"; 

//Some interesting points to note down! 
//We are not using the keyword "use" 
//We need to use the same namespace which is "Utility" 
//Therefore, both Class1.php and Class2.php has "namespace Utility" 

//Require is usually the file path! 
//We do not mention the class name in the require " "; 
//What if the Class1.php file is in another folder? 
//Ex:"src/utility/Stopwatch/Class1.php" 

//Then the require will be "Stopwatch/Class1.php" 
//Your namespace would be still "namespace Utility;" for Class1.php 

class Verification 
    { 
    Timer::somefunction(); 
    } 

Der zweite Weg (mit Composern und den automatischen Laden Weg)

Make composer.json file. According to your example "src/Utility" We need to create a composer.json file before the src folder. Example: In a folder called myApp you will have composer.json file and a src folder.

{ 
    "autoload": { 
    "psr-4": { 
     "Utility\\":"src/utility/" 
     } 
    } 
    } 

in diesem Ordner Gehen Sie jetzt Ihren Terminal im Ordner öffnen, in dem es composer.json Datei. Tippen Sie jetzt das Terminal ein!

composer dump-autoload 

Dadurch wird ein Lieferantenordner erstellt. Deshalb, wenn Sie einen Ordner „MyApp“ Sie werden sehen, Verkäufer Ordner src Ordner und eine composer.json Datei

Timer.php(Timer Class)

namespace Utility; 

class Timer 
    { 
     public static function somefunction(){} 
    } 

Verification.php (Verification Class)

namespace Utility; 
require "../../vendor/autoload.php"; 
use Utility\Timer; 

class Verification 
    { 
    Timer::somefunction(); 
    } 

Diese Methode ist mächtiger genannt haben, wenn Sie eine haben komplexe Ordnerstruktur !!