0

, поэтому я начал использовать пространства имен и прочитал некоторые документы, но, похоже, что-то не так.spl_autoloader не загружает классы

Во-первых моя структура приложения, которая строится так:

root 
-dashboard(this is where i want to use the autoloader) 
-index.php 
--config(includes the autoloader) 
--WePack(package) 
---src(includes all my classes) 

сейчас в каталоге Src я включил классы с:

namespace WePack\src; 
class Someclass(){ 

} 

содержание config.php является:

<?php 
// Start de sessie 
ob_start(); 
session_start(); 

// Locate application path 
define('ROOT', dirname(dirname(__FILE__))); 
set_include_path(ROOT); 
spl_autoload_extensions(".php"); // comma-separated list 
spl_autoload_register(); 
echo get_include_path(); 

и пользуюсь им как в моем index.php

require_once ('config/config.php'); 
use WePack\src; 
$someclass = new Someclass; 

Это то, что echo get_include_path(); возвращается:

/home/wepack/public_html/dashboard 

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

ответ

4

Проблема заключается в том, что вы не регистрируете функцию обратного вызова с помощью spl_autoload_register(). обратитесь к официальному номеру docs.

Чтобы быть более гибким, вы можете написать свой собственный класс для регистрации и классов автозагрузки, как это:

class Autoloader 
{ 
    private $baseDir = null; 

    private function __construct($baseDir = null) 
    { 
     if ($baseDir === null) { 
      $this->baseDir = dirname(__FILE__); 
     } else { 
      $this->baseDir = rtrim($baseDir, ''); 
     } 
    } 

    public static function register($baseDir = null) 
    { 
     //create an instance of the autoloader 
     $loader = new self($baseDir); 

     //register your own autoloader, which is contained in this class 
     spl_autoload_register(array($loader, 'autoload')); 

     return $loader; 
    } 

    private function autoload($class) 
    { 
     if ($class[0] === '\\') { 
      $class = substr($class, 1); 
     } 

     //if you want you can check if the autoloader is responsible for a specific namespace 
     if (strpos($class, 'yourNameSpace') !== 0) { 
      return; 
     } 

     //replace backslashes from the namespace with a normal directory separator 
     $file = sprintf('%s/%s.php', $this->baseDir, str_replace('\\', DIRECTORY_SEPARATOR, $class)); 

     //include your file 
     if (is_file($file)) { 
      require_once($file); 
     } 
    } 
} 

после этого вы будете зарегистрировать автозагрузчик так:

Autoloader::register("/your/path/to/your/libraries"); 
+0

это не работает, он по-прежнему говорит, что класс не найден –

+0

Я удалил пространство имен в файле классов и начал работать. но я хочу использовать пространства имен –

+0

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

0

Isn» т это то, что вы имеете в виду:

spl_autoload_register(function($class) { 
    include_once ROOT.'/classes/'.$class.'.php'; 
}); 

Таким образом, вы можете просто вызвать класс, как:

$user = new User(); // And loads it from "ROOT"/classes/User.php 
+0

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

+0

Поскольку у меня нет опыта работы с пространствами имен, я не могу дать вам полный ответ на это. все равно работайте так же. Я думаю, что если вы будете использовать 'use \ User $ user = n ew User() 'он все равно будет работать. И с «дополнительной библиотекой» вы имеете в виду что-то вроде PHPmailer? – SuperDJ

+0

hmm нет, поскольку phpmailer существовал до пространств имен, которые он не использует, больше похожи на библиотеки, такие как Ivory и Geocoder-php –

 Смежные вопросы

  • Нет связанных вопросов^_^