Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
1

Автоподключение классов

06.04.2016, 17:08. Показов 2642. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал скрипт:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Autoload($name){
    $class_pieces = explode('\\', $name);
    switch ($class_pieces[0]){
        case 'app':
            $path = __DIR__ . '\\' . implode(DIRECTORY_SEPARATOR, $class_pieces) . '.php';
            if (file_exists($path)){
                require_once $path;
            }
            else {
                 echo "The file $path does not exist";
            }
    }
}
spl_autoload_register('Autoload'); 
$router = new \app\Router();
$router->start();
В части:
PHP
1
2
3
4
5
6
if (file_exists($path)){
                require_once $path;
            }
            else {
                 echo "The file $path does not exist";
            }
Выполняется первое условие. Т.е. файл существует, путь верный. Но дальше вылазит ошибка:
Fatal error: Class 'app\Router' not found in C:\server\Site\OpenServer\domains\rainforest\Vasilisk\index.php on line 19
Что не так? Сделал все по уроку. У автора работает.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2016, 17:08
Ответы с готовыми решениями:

Автоподключение
Можно ли как-то сделать автоподключение к серверу при запуске бд или открытии формы?

Автоподключение к wi-fi
Как отключить автоподключение к wi-fi?

автоподключение в фоне
здравствуйте. подключение к интернет по pppoe, для автоподключения оного на старте системы в раздел...

Автоподключение к нэту
Как сделать чтобы нэт включался при включении компа?

33
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
06.04.2016, 19:23 2
не знаю как у автора, а функция (в вашем случае Autoload)должна возвращать true или false

Добавлено через 4 минуты
Цитата Сообщение от Vassillissk Посмотреть сообщение
__DIR__ . '\\'
не нужно использовать двойной обратный слеш в разделителях пути. используйте обычный слеш / , даже если вы на винде. Пхп простит. в некоторых случаях можно использовать константу DIRECTORY_SEPARATOR, но обычно можно обойтись без нее
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.04.2016, 19:49 3
Цитата Сообщение от Vassillissk Посмотреть сообщение
Выполняется первое условие. Т.е. файл существует, путь верный.
Если файл с таким названием существует, это еще не значит что в этом файле существует класс Router в пространстве имен app.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
06.04.2016, 20:20  [ТС] 4
Содержание класса:
PHP
1
2
3
4
5
class Router {
    public function start(){
        echo $_SERVER['REQUEST_URI'];
    }
}
var_dump(spl_autoload_register('Autoload'));
PHP
1
boolean true
За слеши спасибо. Только учусь, теперь буду знать.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.04.2016, 20:41 5
Цитата Сообщение от Vassillissk Посмотреть сообщение
Содержание класса:
Ну вот, а \app\ откуда возьмется.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 20:55 6
не стоит проверять наличие файла. не зачем
достаточно написать так, и манипулировать namespace
PHP
1
2
3
4
5
6
7
8
spl_autoload_register(
/**
 * @param string $class
 */
    function ($class) {
        include str_replace('\\', '/', $class) . '.php';
    }
);
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
06.04.2016, 21:03  [ТС] 7
Ну так это папка с классами... В этом и смысл загрузчика. В переменной $path содержится "C:\server\Site\OpenServer\domains\rainforest\Vasilisk\app\Router.php"

Добавлено через 5 минут
Poznakomlus,
Я не столь разбираюсь, что бы понять, о чем вы.
У меня по уроку, spl_autoload_register запускает загрузчик Autoload. Который перехватывает классы и подключает их, разбивая на путь к файлу и сам файл.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 21:14 8
Я привел то-же самое. Без лишнего дебилизма. О чем может написать автору урока, что не стоит проверять наличие файла класса в автозагрузчике
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
06.04.2016, 21:20  [ТС] 9
Poznakomlus,
PHP
1
2
3
4
switch ($class_pieces[0]){
        case 'app':
            require_once __DIR__ . '\\' . implode(DIRECTORY_SEPARATOR, $class_pieces) . '.php';
    }
Правильно понял? Ошибка все равно та же.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 21:28 10
нет не правильно вот этого кода достаточно
PHP
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Automatic loader classes
 */
spl_autoload_register(
/**
 * @param string $class
 */
    function ($class) {
        //var_dump(str_replace('\\', '/', $class) . '.php');
        include str_replace('\\', '/', $class) . '.php';
    }
);
разкомментируйте var_dump, чтобы увидеть неправильный путь
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.04.2016, 21:32 11
Лучший ответ Сообщение было отмечено Vassillissk как решение

Решение

Цитата Сообщение от Vassillissk Посмотреть сообщение
Ну так это папка с классами...
Нет, в контексте
PHP
1
new \app\Router()
app - это пространство имен, а не "папка". То есть класс Router должен находиться в пространстве имен app. То есть должно быть не просто
PHP
1
2
3
4
5
class Router {
    public function start(){
        echo $_SERVER['REQUEST_URI'];
    }
}
а
PHP
1
2
3
4
5
6
namespace app;
class Router {
    public function start(){
        echo $_SERVER['REQUEST_URI'];
    }
}
1
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
06.04.2016, 21:37  [ТС] 12
Poznakomlus,
Все, понял ваш код. Только ошибка та же.
PHP
1
string 'app/Router.php' (length=14)
PHP
1
Fatal error: Class 'app\Router' not found in C:\server\Site\OpenServer\domains\rainforest\Vasilisk\index.php on line 21
0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
06.04.2016, 21:39 13
Цитата Сообщение от Poznakomlus Посмотреть сообщение
что не стоит проверять наличие файла класса в автозагрузчике
очень даже стоит. Например чтобы корректно срабатывала функция class_exists, а приложение не падало с fatal error при ее вызове
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
06.04.2016, 21:42  [ТС] 14
С пространством имен не сталкивался, пошел читать. Спасибо, что разъяснили очередную глупую ошибку.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 21:53 15
Цитата Сообщение от wq Посмотреть сообщение
очень даже стоит. Например чтобы корректно срабатывала функция class_exists, а приложение
class_exists здесь при чем?
не падало с fatal error при ее вызове
это где, что падать то должно. если вы делаете ошибку тогда и правьте ее сразу
не стоит специально писать говнокод
0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
06.04.2016, 21:59 16
Цитата Сообщение от Poznakomlus Посмотреть сообщение
это где, что падать то должно. если вы делаете ошибку тогда и правьте ее сразу
как будете править Fatal error: require(): Failed opening required... при вызове class_exists для проверки несуществующего класса
Цитата Сообщение от Poznakomlus Посмотреть сообщение
class_exists здесь при чем?
ну говнокодить так говнокодить. конечно эта функция не причем и в программе использоваться не будет, только потому что автолоад кривой
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 22:06 17
PHP
1
2
3
4
5
6
7
8
9
spl_autoload_register(
/**
 * @param string $class
 */
    function ($class) {
        @include str_replace('\\', '/', $class) . '.php';
    }
);
var_dump(class_exists('D'));
ага собака друг человека
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.04.2016, 22:07 18
Цитата Сообщение от wq Посмотреть сообщение
очень даже стоит. Например чтобы корректно срабатывала функция class_exists, а приложение не падало с fatal error при ее вызове
1. А Вы каждый раз перед созданием объекта или при других обращениях к классу используете class_exists?
2. Интересно а что же делать если он не exists?
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
06.04.2016, 22:11 19
при чем ошибка без собаки Warning, которые вы на продакшене должны отключить
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.04.2016, 22:12 20
Цитата Сообщение от Poznakomlus Посмотреть сообщение
@
Ага, тогда останется "Fatal error: Class 'app\Router' not found" в любом случае, только уже будет непонятно с чего это он вдруг not found Может файла не существует, а может и существует... в php собака - враг человека, самый настоящий...
0
06.04.2016, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 22:12
Помогаю со студенческими работами здесь

Автоподключение rvm
Что бы можно было взаимодействовать с рельсами, при открытии терминала мне нужно выполнять source...

Автоподключение проектора
Имеется ноутбуки с видеочипсетами intel и nvidea на XP которые нужно подключать к проекторам. Люди...

Windows 10 автоподключение wifi
Вобщем хотел узнать как сделать что бы когда виндовс 10 загрузился чтобы автоматом не только шло...

Автоподключение по telnet, ssh
Добрый день! подскажите, как создать кнопку запуска на рабочем столе, чтобы при выполнении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru