2016-04-22 1 views
1

Je suis nouveau avec cette chose namespace. J'ai 12 classes (fichiers séparés) dans mon répertoire de base, disons class1.php et class2.php dans un répertoire src/.PHP classe introuvable lors de l'utilisation de l'espace de noms

class1.php

namespace \src\utility\Timer; 

class Timer{ 
    public static function somefunction(){ 

    } 
} 

class2.php

namespace \src\utility\Verification; 
use Timer; 

class Verification{ 
    Timer::somefunction(); 
} 

Lorsque j'exécute class2.php, je reçois l'erreur fatale qui

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

Je lis quelque part sur ALORS , que j'ai besoin de créer Autoloaders pour cela. Si c'est le cas, comment puis-je m'y prendre pour en créer un, et sinon, alors quel est le problème?

MISE À JOUR

J'ai créé un chargeur automatique qui sera require tous les fichiers requis sur le dessus de mon script php. Donc, maintenant le class2.php finirait comme ça.

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

class Verification{ 
    Timer::somefunction(); 
} 

Cela ne fonctionne pas non plus, et indique que cette classe est introuvable. Mais, si je supprime tous les namespaces, et use. Tout fonctionne bien.

+0

Essayez dans votre classe2.php avec utilisation \ src \ Minuterie \ Minuterie comme minuterie; –

+0

@ManinderpreetSingh Essayé. Même problème. –

+0

Je pense que vous devriez vérifier [Composer] (http://getcomposer.org). Un espace de noms est simplement un identifiant unique pour une classe. Le chargement automatique de PHP est surchargé lorsqu'une classe est instanciée alors qu'elle n'existe pas mais avant que le pré-processeur ne lance une erreur T_FATAL. La pratique habituelle est de remplacer ensuite '\' par '/' et de le charger à partir d'une structure de dossiers (pourquoi l'espace de noms correspond généralement à une structure de répertoire) – ash

Répondre

1

Vous allez devoir implémenter un autochargeur, comme vous l'avez déjà lu dans SO.

Vous pouvez vérifier le PSR-4 standard à chargement automatique au http://www.php-fig.org/psr/psr-4/ et vous pouvez voir un exemple d'implémentation du chargement automatique du PSR-4 et une implémentation de classe exemple pour gérer plusieurs espaces de noms ici https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md.

+0

Je vois, je les lisais en ce moment, c'est-à-dire que les mots-clés 'namespace' et' use' sont inutiles sans un chargeur automatique? –

+1

Les espaces de noms sont juste un moyen d'encapsuler des objets comme les docs disent – Andreas

5

Nous pouvons résoudre le problème d'espace de noms de deux façons

1) We can just use namespace and require

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

La première (namespace et nécessitent) façon

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(); 
    } 

La deuxième façon (avec le compositeur et la façon autoloading)

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/" 
     } 
    } 
    } 

Maintenant, allez dans ce dossier ouvrez votre terminal dans l'emplacement du dossier où il y a fichier composer.json. Maintenant, tapez dans le terminal!

composer dump-autoload 

Cela créera un dossier fournisseur. Par conséquent, si vous avez un dossier nommé « MyApp » vous verrez dossier fournisseur, le dossier src et un fichier composer.json

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(); 
    } 

Cette méthode est plus puissant lorsque vous avez un structure de dossier complexe !!