2016-08-04 1 views
0

J'ai fondamentalement la structure de répertoire suivantPourquoi PHP trouve pas ma classe au sein de l'espace de noms

  • MiniCrawler
    • Scripts/
      • htmlCrawler.php
    • index
    • . php

This is the index.php

use Scripts\htmlCrawler; 

class Main 
{ 
    public function init() 
    { 
     $htmlCrawler = new htmlCrawler(); 
     $htmlCrawler->sayHello(); 
    } 
} 

$main = new Main(); 
$main->init(); 

And this is the /Scripts/htmlCrawler.php

namespace Scripts; 

    class htmlCrawler 
    { 
     public function sayHello() 
     { 
      return 'sfs'; 
     } 
    } 

Le code jette l'erreur suivante

Fatal error: Class 'Scripts\htmlCrawler' not found in /mnt/htdocs/Spielwiese/MiniCrawler/index.php on line 9

+0

Est-ce que vous incluez '/ Scripts/htmlCrawler.php' n'importe où dans votre fichier' index.php'? – AntoineB

+0

@AntoineB Cela fonctionne si j'utilise include ('Scripts/htmlCrawler.php'); Par exemple, les classes Symfony n'utilisent que l'instruction 'use' sans inclure les fichiers à l'intérieur de l'autre – user3531149

+0

J'ai tout détaillé dans ma réponse :) – AntoineB

Répondre

2

Vous avez oublié d'inclure le fichier /Scripts/htmlCrawler.php dans votre fichier index.php.

require_once "Scripts/htmlCrawler.php"; 

use Scripts\htmlCrawler; 

class Main 
{ 
    public function init() 
    { 
     $htmlCrawler = new htmlCrawler(); 
     $htmlCrawler->sayHello(); 
    } 
} 

$main = new Main(); 
$main->init(); 

Votre fichier d'index ne peut pas trouver la définition du fichier htmlCrawler si vous ne fournissez jamais le fichier définissant cette classe, et l'utilisation de namespaces ne comprend pas automatiquement les classes requises.

La raison pour laquelle les frameworks n'exigent pas que vous incluiez manuellement le fichier et que vous pouvez simplement ajouter l'instruction use est parce qu'ils gèrent l'inclusion des classes requises pour le développeur. La plupart des frameworks utilisent composer pour gérer l'inclusion automatique des fichiers. Vous pouvez obtenir une fonctionnalité similaire en utilisant autoloading.

+2

Pourrait également suggérer 'composer' à prendre soin de l'autoloading – DarkBee