За последние 24 часа нас посетили 16647 программистов и 1681 робот. Сейчас ищут 819 программистов ...

Ошибка автолоадера в роутере

Тема в разделе "PHP для новичков", создана пользователем vital8111, 1 сен 2016.

  1. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    День добрый подскажите пожалуйста в чем косяк. Не могу разобраться.
    Пишу роутер.
    Получаю ошибку
    Cannot redeclare __autoload() (previously declared in ...:6) in ... on line 6

    сам файл
    PHP:
    1. <?php
    2.  
    3. ini_set('error_reporting', E_ALL);
    4. ini_set('display_errors', 1);
    5. ini_set('display_startup_errors', 1);
    6.  
    7. require_once __DIR__ . '/autoload.php';
    8.  
    9. //var_dump($_SERVER['REQUEST_URI']);
    10. $uri = $_SERVER['REQUEST_URI'];
    11. echo $uri;
    12. echo "<br>";
    13. $pos = strripos($uri,'/');
    14. echo $pos;
    15. echo "<br>";
    16. $controllerName = substr($uri,1,$pos-1);
    17. echo $controllerName;
    18. echo "<br>";
    19. $action = substr($uri,$pos+1);
    20. echo $action;
    21. echo "<br>";
    22. $controller = new $controllerName();
    23.  
    24. if(!isset($action)) $action = 'Index';
    25. $controller->action($action);
    26.  
    27. файл автолоад
    28.  
    29. <?php
    30.  
    31. function __autoload($class)
    32. {
    33.   require __DIR__ . '/' .str_replace('\\', '/', $class) . '.php';
    34. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Опять эта мистика, какая версия PHP?
     
  3. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    7
    --- Добавлено ---
    7.0.8 если быть точным. но думаю это не принципиально
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Есть готовый autoloader с namespace и т. д., есть к чему стремится http://www.php-fig.org/psr/psr-4/
    Пример https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md

    PHP:
    1. strripos($uri,'/');
    2. substr($uri,1,$pos-1);
    3. substr($uri,$pos+1);
    Есть же
    https://secure.php.net/manual/ru/function.parse-url.php
    и
    https://secure.php.net/manual/ru/function.parse-str.php
    вот ещё на будущее как собирать query
    https://secure.php.net/manual/ru/function.http-build-query.php
    --- Добавлено ---
    Всё может, быть, надо проверить, надо test.php/example запустить, чтобы он example.php загрузил?
     
    askanim нравится это.
  5. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    Не понял.
    Это индексный файл. в нем роутер. причем тут test.php(апачем перепишется все равно в index. Одна точка входа в приложении)

    Посмотрю готовый. Спасибо. Но все равно хотелось бы свой косяк понять
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Подкрути код, не запускается он у меня
    Код (Text):
    1. /example
    2. 0
    3. exampl
    4. example
    5.  
    6. Warning: require(/home/public_html/exampl.php): failed to open stream: No such file or directory in /home/public_html/autoload.php on line 5
    7.  
    8. Fatal error: require(): Failed opening required '/home/public_html/exampl.php' (include_path='.:/opt/alt/php56/usr/share/pear:/opt/alt/php56/usr/share/php') in /home/public_html/autoload.php on line 5
    --- Добавлено ---
    Может я хочу его test.php назвать, чтобы тебе помочь, но код этого не позволяет, не усложняй задачу тем кто хочет помочь
     
  7. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    и что тут подкручивать?
    Автолоад и индекс в одной папке. Должно работать
    --- Добавлено ---
    Я не пойму что ты от меня хочешь
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Чтобы можно было с любого адреса запускать.

    Не работает

    Ничего, просто пишу что не работает твой код.
     
  9. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    он ругается на файл автолоада
    что его нету
    он и не будет без него работать
    я же выложил автолоад
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @vital8111 нет, прочитай ошибку ещё раз
     
  11. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    PHP:
    1. <?php
    2.  
    3. ini_set('error_reporting', E_ALL);
    4. ini_set('display_errors', 1);
    5. ini_set('display_startup_errors', 1);
    6.  
    7. require_once __DIR__ . '/autoload.php';
    8.  
    9. //var_dump($_SERVER['REQUEST_URI']);
    10. $uri = $_SERVER['REQUEST_URI'];
    11. echo $uri;
    12. echo "<br>";
    13. $pos = strripos($uri,'/');
    14. echo $pos;
    15. echo "<br>";
    16. $controllerName = substr($uri,1,$pos-1);
    17. echo $controllerName;
    18. echo "<br>";
    19. $action = substr($uri,$pos+1);
    20. echo $action;
    21. echo "<br>";
    22. $controller = new $controllerName();
    23.  
    24. if(!isset($action)) $action = 'Index';
    25. $controller->action($action);


    PHP:
    1. <?php
    2. function __autoload($class)
    3. {
    4.   require __DIR__ . '/' .str_replace('\\', '/', $class) . '.php';
    5. }




    --- Добавлено ---
    2 файла выложил
    1 индекс 2 автолоад
     
    #11 vital8111, 1 сен 2016
    Последнее редактирование: 1 сен 2016
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а где третий который будет автолоадом загружен?
    --- Добавлено ---
    Код оформляй, кнопка </> в редакторе.
     
  13. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5.  
    6. class Controller
    7. {
    8.     protected $view;
    9.  
    10.     public function action($action){
    11.         $methodName = 'action'.$action;
    12.         return $this->$methodName();
    13. }
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Как этот файл назвать? С какими параметрами запускать index.php?
     
  15. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    это controller.php
    сам он не сработает
    сейчас скину дочерний класс
    --- Добавлено ---
    PHP:
    1. <?php
    2.  
    3. namespace App\Controllers;
    4.  
    5.  
    6. use App\Controller;
    7.  
    8. class News extends Controller
    9. {
    10.     public function __construct()
    11.     {
    12.         $this->view = new \App\View();
    13.     }
    14.     protected function actionIndex(){
    15.         $this->view->news = \App\Models\News::findAll();
    16.         $this->view->title = 'Новости';
    17.         $this->view->desc = 'Сайт РїСЂРѕ новости';
    18.         $this->view->display(__DIR__ . '/../templates/news.php');
    19.     }
    20.     protected function actionOne(){
    21.         $id = $_GET['id'];
    22.         $this->view->article = \App\Models\News::findOne($id);
    23.         $this->view->display(__DIR__ . '/../templates/one.php');
    24.     }
    25. }

    называется news.php
    вызываю /news/index
    ну или просто /news/
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (Text):
    1. /news/index
    2. 5
    3. news
    4. index
    5.  
    6. Fatal error: Class 'news' not found in /home/public_html/index.php on line 22
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну вот система нормальным английским языком написала, что не так. Почему бы не перевести, прежде чем на форум писать?
    Код (Text):
    1. Cannot redeclare __autoload() (previously declared in ...:6) in ... on line 6
    Если ссылка идёт на один файл, значит он дважды заинклюдился, если на разные - значит в обоих есть __autoload()
     
  18. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Полный текст ошибки можешь привести?
     
  19. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    1 и тот же файл.
    Как он может 2 раза заинклудиться.
    Он вызывается 1 раз в индексе и все.
    Больше его нигде нет.

    ПЫ.СЫ.
    Там даже require_once не помогает
    --- Добавлено ---
    Fatal error: Cannot redeclare __autoload() (previously declared in /var/www/html/php2/autoload.php:6) in /var/www/html/php2/autoload.php on line 6
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @mkramer опять такая ошибка что redeclare в одном и том же файле и на одной и той же строчке.
    Как такое повторить? Когда в прошлый раз вели диалог об такой ошибки, её воспроизвести не вышло.
     
  21. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    а mod_rewrite не переписывает пхпшные пути?
    он только веб запросы переписывает?
    --- Добавлено ---
    а у вас ошибка вылетает какая то?
    Или все чисто отрабатывает?
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Файл где-то второй раз подключается, другого предположить не могу. Не видно же в целом систему
     
  23. vital8111

    vital8111 Новичок

    С нами с:
    22 мар 2016
    Сообщения:
    52
    Симпатии:
    1
    Разобрался.
    Проблема была в неправильных слешах
    в URI и Namespace слеши в разные стороны(не обратил внимания сначала)
    вторая проблема имена классов в неправильном регистре(хотя я думал что пых регистронезависимый)

    PHP:
    1. <?php
    2.  
    3. ini_set('error_reporting', E_ALL);
    4. ini_set('display_errors', 1);
    5. ini_set('display_startup_errors', 1);
    6.  
    7. require __DIR__ . '/autoload.php';
    8.  
    9. $uri = $_SERVER['REQUEST_URI'];
    10. $arr = explode('/',$uri);
    11. $i = 0;
    12. foreach ($arr as $str){
    13.     $arr[$i] = ucfirst($str);
    14.     $i++;
    15. }
    16. $actionName = $arr[count($arr)-1];
    17. unset($arr[count($arr)-1]);
    18. $controllerName = '\\'.implode('\\',$arr);
    19. $controller = new $controllerName();
    20.  
    21. if(isset($_GET['action']))
    22.     $action = $_GET['action'];
    23. else
    24.     $action = 'Index';
    25. $controller->action($action);


    Так сделал.
     
  24. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    перед определением функции выводи стек вызова и найдешь место, из которого второй раз подключаешь этот файл.
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Имена классов регистронезависимы, а вот имена файлов в Linux-е - регистрозависимы
     
    askanim нравится это.