2016-04-08 3 views
0

Его первая работа с автозагрузчиком и получение некоторых ошибок. структура выглядит следующим образом:PHP-автозагрузчик, не работающий с пространствами имен

  • AnimalShop (корень)
    • классы
      • Shop.php
    • index.php

У меня есть следующий простой код

index.php

<?php 

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

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

// Create a shop 

$shop = new Shop(); 

Магазин простой класс

<?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>"; 
      } 
     } 
    } 

Когда я запустить index.php я получаю следующие ошибки:

Предупреждение: include (Shop.php): не удалось открыть поток: нет такого файла или каталога в /var/www/phpadvancedCourse/AnimalShop/index.ph p on line 4

Предупреждение: include(): Не удалось открыть «Shop.php» для включения (include_path = '.:/usr/share/php:') в/var/www/phpadvancedCourse/AnimalShop/index. PHP в строке 4

+0

является 'shop.php' находится в'/вар/WWW/phpadvancedCourse/AnimalShop/'? –

+0

nvm я вижу его в вашем вопросе .. –

+0

'include 'classes /'. $ class_name. '.php'; ' – AbraCadaver

ответ

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

ваш путь неправильно .. попробовать это ..

+0

. Над кодом не работает ошибка, которую я получаю: Неустранимая ошибка: нечистая ошибка: класс «Магазин» не найден в/var/www/phpadvancedCourse/AnimalShop/index.php в строке 12 Ошибка: класс «Магазин» не найден в /var/www/phpadvancedCourse/AnimalShop/index.php в строке 12 – Bham

+0

, если это ошибка, которую вы получили, тогда вы не использовали мой код. почему бы вам не попробовать код, который я вам дал, прежде чем сказать, что он не работает. –

0

Для решения этой проблемы я использовал PSR-4 самозарядный через композитор со следующей структурой и кодом.

Структура

  • AnimalShop (корень)
    • index.php
    • приложение (Папка)
      • Поведение (Папка)
        • WalkBehavior .php (интерфейс)
      • Домашние животные (Папка)
        • Cat.php
        • Dog.php
        • Fish.php
        • Pets.php (абстрактный класс)
      • Магазин (Папка)
        • 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(); 

Пример Petshop и собаки

<?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"; 
    } 
} 
Смежные вопросы