2016-04-08 4 views
0

Es ist das erste Mal mit einem Autoloader arbeiten und einige Fehler zu bekommen. Die Struktur ist wie folgt:PHP Autoloader arbeitet nicht mit Namespaces

  • AnimalShop (root)
    • Klassen
      • Shop.php
    • index.php

Ich habe den folgenden einfachen Code

Index.php

<?php 

spl_autoload_register(function ($class_name) 
{ 
    include $class_name . '.php'; 
}); 

echo "<h1>PETs SHOP</h1>"; 

// Create a shop 

$shop = new Shop(); 

Shop ist eine einfache Klasse

<?php 

namespace PHPAdvanced\AnimalShop\classes; 

/* 
* Pet shop 
*/ 

    class Shop 
    { 

     /** 
     * @var Pets[] pets 
     */ 
     private $pets = []; 

     public function addPetsToArray(Pets $pet) 
     { 
      $this->pets[] = $pet; 
     } 


     /** 
     * Print pets naam 
     */ 
     public function printPets() 
     { 
      foreach($this->pets as $pet) 
      { 
       echo "<p>" . $pet->getPetNaam() . "</p>"; 
      } 
     } 
    } 

Wenn ich laufen index.php i die folgenden Fehlermeldungen erhalten:

Warnung: include (Shop.php): Fehler beim Öffnen des Streams: Keine solche Datei oder Verzeichnis in /var/www/phpadvancedCourse/AnimalShop/index.ph p on line 4

Warnung: include(): Fehler beim Öffnen von 'Shop.php' für die Aufnahme (include_path = '.:/usr/share/php:') in/var/www/phpadvancedCourse/AnimalShop/index. php on line 4

+0

ist 'shop.php' befindet sich in'/var/www/phpadvancedCourse/AnimalShop/'? –

+0

nvm Ich sehe es in Ihrer Frage .. –

+0

'include 'Klassen /'. $ Klassenname. '.php'; ' – AbraCadaver

Antwort

0
spl_autoload_register(function ($class_name) 
{ 
    include realpath(dirname(__FILE__))."/classes/".$class_name . '.php'; 
}); 

Ihr Weg falsch ist .. versuchen, dies ..

+0

Oben Code funktioniert nicht der Fehler, den ich bekomme ist: Fataler Fehler: Uncaught Fehler: Class 'Shop' nicht gefunden in/var/www/phpadvancedCourse/AnimalShop/index.php on line 12 Fehler: Klasse 'Shop' nicht gefunden in /var/www/phpadvancedCourse/AnimalShop/index.php on line 12 – Bham

+0

Wenn das der Fehler ist, dann haben Sie nicht meinen Code verwendet. Warum versuchst du nicht den Code, den ich dir gegeben habe, bevor du sagst, dass es nicht funktioniert? –

0

Um das Problem zu lösen i PSR-4 autoloading durch Komponisten mit der folgenden Struktur und Code verwendet habe.

Structure

  • AnimalShop (root)
    • index.php
    • App (Ordner)
      • Behavior (Ordner)
        • WalkBehavior .php (Schnittstelle)
      • Haustiere (Ordner)
        • Cat.php
        • Dog.php
        • Fish.php
        • Pets.php (abstrakte Klasse)
      • Geschäft (Ordner)
        • PetShop.php

Composer.json

{ 
    "autoload" : { 
     "psr-4" : { 
      "App\\" : "App" 
     } 
    } 
} 

index.php

<?php 

// Autoload 
require "vendor/autoload.php"; 

use App\Shop\PetShop; 
use App\Pets\Dog; 
use App\Pets\Fish; 
use App\Pets\Cat; 

echo "<h1>PETs SHOP</h1>"; 

// Create a shop 
$shop = new PetShop(); 

$shop->addPetsToArray(new Dog("Yuki")); 
$shop->addPetsToArray(new Fish("BLubie")); 
$shop->addPetsToArray(new Cat("Cattie")); 

$shop->printPets(); 

Beispiel für Petshop und Hund

<?php 

namespace App\Shop; 

use App\Pets\Pets; 

/* 
* Pet shop 
*/ 

class PetShop 
{ 

    /** 
    * @var Pets[] pets 
    */ 
    private $pets = []; 

    public function addPetsToArray(Pets $pet) 
    { 
     $this->pets[] = $pet; 
    } 


    /** 
    * Print pets naam 
    */ 
    public function printPets() 
    { 
     foreach($this->pets as $pet) 
     { 
      echo "<p>" . $pet->getPetNaam() . "</p>"; 
     } 
    } 
} 

DOG

<?php 
namespace App\Pets; 

/** 
* Class Dog 
*/ 
class Dog extends Pets 
{ 
    /** 
    * Dog constructor. 
    * 
    * @param $name 
    */ 
    public function __construct(string $name) 
    { 
     parent::__construct($name); 
    } 

    public function walk() : string 
    { 
     return "Dog is walking"; 
    } 
}