День добрый подскажите пожалуйста в чем косяк. Не могу разобраться. Пишу роутер. Получаю ошибку Cannot redeclare __autoload() (previously declared in ...:6) in ... on line 6 сам файл PHP: <?php ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); require_once __DIR__ . '/autoload.php'; //var_dump($_SERVER['REQUEST_URI']); $uri = $_SERVER['REQUEST_URI']; echo $uri; echo "<br>"; $pos = strripos($uri,'/'); echo $pos; echo "<br>"; $controllerName = substr($uri,1,$pos-1); echo $controllerName; echo "<br>"; $action = substr($uri,$pos+1); echo $action; echo "<br>"; $controller = new $controllerName(); if(!isset($action)) $action = 'Index'; $controller->action($action); файл автолоад <?php function __autoload($class) { require __DIR__ . '/' .str_replace('\\', '/', $class) . '.php'; }
Есть готовый 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: strripos($uri,'/'); substr($uri,1,$pos-1); 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 загрузил?
Не понял. Это индексный файл. в нем роутер. причем тут test.php(апачем перепишется все равно в index. Одна точка входа в приложении) Посмотрю готовый. Спасибо. Но все равно хотелось бы свой косяк понять
Подкрути код, не запускается он у меня Код (Text): /example 0 exampl example 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 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 назвать, чтобы тебе помочь, но код этого не позволяет, не усложняй задачу тем кто хочет помочь
и что тут подкручивать? Автолоад и индекс в одной папке. Должно работать --- Добавлено --- Я не пойму что ты от меня хочешь
Чтобы можно было с любого адреса запускать. Не работает Ничего, просто пишу что не работает твой код.
PHP: <?php ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); require_once __DIR__ . '/autoload.php'; //var_dump($_SERVER['REQUEST_URI']); $uri = $_SERVER['REQUEST_URI']; echo $uri; echo "<br>"; $pos = strripos($uri,'/'); echo $pos; echo "<br>"; $controllerName = substr($uri,1,$pos-1); echo $controllerName; echo "<br>"; $action = substr($uri,$pos+1); echo $action; echo "<br>"; $controller = new $controllerName(); if(!isset($action)) $action = 'Index'; $controller->action($action); PHP: <?php function __autoload($class) { require __DIR__ . '/' .str_replace('\\', '/', $class) . '.php'; } --- Добавлено --- 2 файла выложил 1 индекс 2 автолоад
а где третий который будет автолоадом загружен? --- Добавлено --- Код оформляй, кнопка </> в редакторе.
PHP: <?php namespace App; class Controller { protected $view; public function action($action){ $methodName = 'action'.$action; return $this->$methodName(); }
это controller.php сам он не сработает сейчас скину дочерний класс --- Добавлено --- PHP: <?php namespace App\Controllers; use App\Controller; class News extends Controller { public function __construct() { $this->view = new \App\View(); } protected function actionIndex(){ $this->view->news = \App\Models\News::findAll(); $this->view->title = 'Новости'; $this->view->desc = 'Сайт РїСЂРѕ новости'; $this->view->display(__DIR__ . '/../templates/news.php'); } protected function actionOne(){ $id = $_GET['id']; $this->view->article = \App\Models\News::findOne($id); $this->view->display(__DIR__ . '/../templates/one.php'); } } называется news.php вызываю /news/index ну или просто /news/
Код (Text): /news/index 5 news index Fatal error: Class 'news' not found in /home/public_html/index.php on line 22
Ну вот система нормальным английским языком написала, что не так. Почему бы не перевести, прежде чем на форум писать? Код (Text): Cannot redeclare __autoload() (previously declared in ...:6) in ... on line 6 Если ссылка идёт на один файл, значит он дважды заинклюдился, если на разные - значит в обоих есть __autoload()
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
@mkramer опять такая ошибка что redeclare в одном и том же файле и на одной и той же строчке. Как такое повторить? Когда в прошлый раз вели диалог об такой ошибки, её воспроизвести не вышло.
а mod_rewrite не переписывает пхпшные пути? он только веб запросы переписывает? --- Добавлено --- а у вас ошибка вылетает какая то? Или все чисто отрабатывает?
Разобрался. Проблема была в неправильных слешах в URI и Namespace слеши в разные стороны(не обратил внимания сначала) вторая проблема имена классов в неправильном регистре(хотя я думал что пых регистронезависимый) PHP: <?php ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); require __DIR__ . '/autoload.php'; $uri = $_SERVER['REQUEST_URI']; $arr = explode('/',$uri); array_shift($arr); $i = 0; foreach ($arr as $str){ $arr[$i] = ucfirst($str); $i++; } $actionName = $arr[count($arr)-1]; unset($arr[count($arr)-1]); $controllerName = '\\'.implode('\\',$arr); $controller = new $controllerName(); if(isset($_GET['action'])) $action = $_GET['action']; else $action = 'Index'; $controller->action($action); Так сделал.
перед определением функции выводи стек вызова и найдешь место, из которого второй раз подключаешь этот файл.