Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, авторегистрация классов / 8 сообщений из 8, страница 1 из 1
26.02.2015, 15:52
    #38889632
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
Подскажите, как правильно делать?
У меня есть такая файловая структура:
Код: 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
26.02.2015, 16:23
    #38889694
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
PSR-0 ?
...
Рейтинг: 0 / 0
26.02.2015, 16:31
    #38889716
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
Alibek B.,

function __autoload($classname) {
$filename = "class/". $classname .".php";
include_once($filename);
}
...
Рейтинг: 0 / 0
26.02.2015, 16:52
    #38889777
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
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
26.02.2015, 16:55
    #38889782
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
Разобрался.
В самом файле TestClass.php у меня было написано "class TestClass".
Поправил описание класса, все работает.
...
Рейтинг: 0 / 0
26.02.2015, 17:05
    #38889805
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
Хотя нет, вопросы остались.
Можно ли сделать так, чтобы работали оба способа создания экземпляра класса (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
26.02.2015, 17:35
    #38889841
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
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
26.02.2015, 18:41
    #38889932
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, авторегистрация классов
Ок, тогда обойдусь без namespace.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, авторегистрация классов / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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