powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, авторегистрация классов
8 сообщений из 8, страница 1 из 1
PHP, авторегистрация классов
    #38889632
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как правильно делать?
У меня есть такая файловая структура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
./
  lib/
    auto/
      TestClass.php
      TestClass/
        TestClassBase.php
        TestClassExtra.php
    base/
      DataBindingClass.php
      CommonControls.php
    header.php
  www/
    index.php
index.php — это точка входа, в нем инклюдится header.php.
header.php — общий для всех точек входа код, в котором инициализируются константы, подключаются общие библиотеки и функции и т.п.
В подкаталоге lib/auto размещаются классы, которые должны подключаться автоматически. Называются они по шаблону NameClass.php. Некоторые классы могут быть распределены по нескольким файлам, эти файлы будут размещаться в подкаталоге с именем NameClass. Но для простых классов таких подкаталогов не будет.
В подкаталоге lib/base размещаются классы, которые подключаются вручную.

Как это сделать?
В помощью spl_autoload_register?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
spl_autoload_register(
    function ($class)
    {
        if (file_exists("./lib/auto/$class.php"))
        {
            include("./lib/auto/$class.php");
        }
    }
);

new TestClass;





________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889694
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PSR-0 ?
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889716
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

function __autoload($classname) {
$filename = "class/". $classname .".php";
include_once($filename);
}
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889777
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowPSR-0 ?
Я про него и не знал.
Нет, у меня немного другая структура файлов.

Написал такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
class ClassAutoLoader
{

        protected $nsmap = array('auto'=>"auto");

        function __construct($map=null)
        {
                if (defined($map))
                {
                        foreach ($map as $namespace=>$dir)
                        {
                                $this->nsmap[$namespace] = $dir;
                        }
                }
                spl_autoload_register(array($this, 'autoload'));
        }

        function __destruct()
        {
                spl_autoload_unregister(array($this, 'autoload'));
        }

        protected function autoload($class)
        {
                $pos = strpos($class,"\\");
                if ($pos===false)
                {
                        $base = 'auto';
                }
                else
                {
                        $base = substr($class,0,$pos);
                        $class = substr($class,$pos,1);
                }
                if (!empty($this->nsmap[$base]))
                {
                        $file = $GLOBALS['_BASE'] . '/lib/' . $this->nsmap[$base] . '/' . $class . 'Class.php';
                        require($file);
                        return true;
                }
                return false;
        }

}

new ClassAutoLoader();

$test1 = new Test();
$test2 = new auto\Test();



Но он почему-то не работает, в логах ошибка "PHP Fatal error: Class 'Test' not found in header.php on line 108".
Хотя имя класса определяется верно, в $file правильный полный путь к php-файлу.
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889782
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался.
В самом файле TestClass.php у меня было написано "class TestClass".
Поправил описание класса, все работает.
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889805
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, вопросы остались.
Можно ли сделать так, чтобы работали оба способа создания экземпляра класса (new Test и new auto\Test)?
Сейчас класс у меня выглядит так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
namespace auto;

class Test
{
        function __construct()
        {
                echo "Test::__construct() \n";
        }
}


При этом new auto\Test работает, new Test не работает.
Если из класса убрать namespace auto, тогда получается наоборот, new Test работает, а new auto\Test не работает.

Такое:
Код: php
1.
use auto as 


не работает, альяс не может быть пустым.

Можно ли сделать так, чтобы можно было использовать оба варианта?
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889841
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Хотя нет, вопросы остались.
Можно ли сделать так, чтобы работали оба способа создания экземпляра класса (new Test и new auto\Test)?
Сейчас класс у меня выглядит так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
namespace auto;

class Test
{
        function __construct()
        {
                echo "Test::__construct() \n";
        }
}


При этом new auto\Test работает, new Test не работает.
Если из класса убрать namespace auto, тогда получается наоборот, new Test работает, а new auto\Test не работает.

Такое:
Код: php
1.
use auto as 


не работает, альяс не может быть пустым.

Можно ли сделать так, чтобы можно было использовать оба варианта?
а зачем вам тогда namespace.
Если вы создаете объект в том же файле, то можно new Test(); если в другом, то use auto\Test. Вместо echo "Test::__construct() \n"; лучше echo __CLASS__ -сразу видно имя класса
...
Рейтинг: 0 / 0
PHP, авторегистрация классов
    #38889932
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, тогда обойдусь без namespace.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, авторегистрация классов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]