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

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

0

Решение

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

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

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");
4

Другие решения

Разве это не то, что вы имеете в виду:

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

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector