Почему PHP не видит класс через namespace??
У меня проблема в следующем, класс не видит другой подключенный класс.
На главной странице сообщение об ошибке:
Fatal error: Uncaught Error: Class «MyProject\Models\ActiveRecordEntity» not found in C:\OSPanel\domains\projectoop\src\MyProject\Models\Articles\Article.php:7 Stack trace: #0 C:\OSPanel\domains\projectoop\index.php(4): require() #1 thrown in C:\OSPanel\domains\projectoop\src\MyProject\Models\Articles\Article.php on line 7
И так код файла «projectoop\src\MyProject\Models\Articles\Article.php»
name; > /** * @return string */ public function getText(): string < return $this->text; > protected static function getTableName(): string < return 'articles'; >>
код файла «projectoop\src\MyProject\Models\ActiveRecordEntity.php»
id; > public function __set(string $name, $value) < $camelCaseName = $this->underscoreToCamelCase($name); $this->$camelCaseName = $value; > private function underscoreToCamelCase(string $source): string < return lcfirst(str_replace('_', '', ucwords($source, '_'))); >/** * @return static[] */ public static function findAll(): array < $db = new Db(); return $db->query('SELECT * FROM `' . static::getTableName() . '`;', [], static::class); > abstract protected static function getTableName(): string; >
Используй Open Server
Модули стоят такие:
HTTP: Apache_2.4-PHP_8.0-8.1
PHP: PHP_8.1
MySQL: MySQL-5.6
Простой 5 комментариев
PHP. Из одного класса не виден другой. Как исправить?
имеется вот такая конструкция. Файл dbclass.php — доступен, иначе при запуске сразу были бы ошибки. Однако, при попытке использовать класс из подключенного файла получаю ошибку Fatal error: Class ‘Blackjack\db_write’ not found in C:\OpenServer\domains\blackjack\blackjack\blackjack.php
Ясно, что ищется не там. ((
namespace Blackjack; $e = new ClasFrom_dbclass;
Неймспейс видно? Ну вот в нем и проблема
Ваш класс запрашивается как ClasFrom_dbclass , в текущем неймспейсе \Blackjack . Значит полное название класса \Blackjack\ClasFrom_dbclass . А на самом деле класс ClasFrom_dbclass видимо расположен в глобальном пространстве имен. Значит и обращаться к нему нужно соответственно $e = new \ClasFrom_dbclass; (внимание на слэш).
Спасибо за идею! а если в начале написать use \ClasFrom_dbclass as ClasFrom_dbclass , мы же сможем использовать его стандартным способом? $e = new ClasFrom_dbclass;
coderisimo: Можно, но зачем? Слэш вроде не сложно дописать для классов в глобальном пространстве имен. «Стандартный» способ — это как раз с указанием неймспейса )
Почему на хостинге не видит класс?
Вот структура проекта:
В проекте использую автозагрузчик Composer. В силу того, что хостинг бесплатный- там нет консоли где я бы мог написать: composer install . Поэтому я сделал это на своём пк и отправил на сервер вместе со сгенерированной папкой vendor. Вот мой composer.json:
namespace core; use application\controllers; use application\models; class Router < public static function buildRoute() < //контроллер по умолчанию $controllerName = "IndexController"; $modelName = "IndexModel"; $action = "index"; $route = explode("/", $_SERVER['REQUEST_URI']); //если URI не пустой, то определяем соотв. контроллер if($route[1] != '') < if(strstr($route[1], '?') == false) < $controllerName = ucfirst($route[1]. "Controller"); $modelName = ucfirst($route[1]. "Model"); >else if(strstr($route[1], 'edittask') == true) < $controllerName = "EdittaskController"; $modelName = "EdittaskModel"; $action = "edit"; >else < $controllerName = "IndexController"; $modelName = "IndexModel"; $action = "index"; $_GET['page'] = stristr($route[1], '='); >> if(file_exists( __DIR__.'/../application/controllers/'.$controllerName.'.php')) < include __DIR__.'/../application/controllers/'.$controllerName.'.php'; include __DIR__.'/../application/models/'.$modelName.'.php'; >else < Router::errorPage(); >if(isset($route[2]) && $route[2] != '') < $action = $route[2]; >$controllerName = '\\application\\controllers\\'.$controllerName; $controller = new $controllerName(); $controller->$action(); > public static function errorPage() < header("HTTP/1.1 404 Not Found"); die(); >>
namespace application\models; use core\DB as DB; class Model < protected $db = null; public function __construct() < $this->db = DB::connectToDB(); > >
В нём происходит вызов класса DB, где и подключается база данных. Но тут автозагрузчик почему-то этот класс просто не видит.
Вот сам класс DB.php:
namespace core; require_once __DIR__.'/../vendor/autoload.php'; class DB < const host = "http://ttbj.zzz.com.ua/"; const user = "pr0gbeg"; const pass = "*пароль (правильный)*"; const dn_name = "pr0gbeg1nner"; public static function connectToDB() < $user = self::user; $pass = self::pass; $host = self::host; $db = self::dn_name; $conn = new \PDO("mysql:dbname=$db;host=$host", $user, $pass); $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); return $conn; > >
Средний 1 комментарий
autoload php composer не видит класс
Тестирую на ОпенСервере коспосер, но-что он не видит классы, в чем ошибаюсь?
Свою автозагрузку отключил, вендор подключил
получаю ошибку
Fatal error: Uncaught Error: Class 'MyProject\Controllers\MainController' not found in D:\OpenServer\domains\MyProject\www\index.php:28 Stack trace: #0 thrown in D:\OpenServer\domains\MyProject\www\index.php on line 28
Там только это
Еще раз. Попробуй убрать ведущий слэш, там где src. Потом «composer dump-autoload» И еще — попробуй автолоад подключить вот так: require_once __DIR__ . ‘/vendor/autoload.php’;
Sevix #:
Еще раз. Попробуй убрать ведущий слэш, там где src. Потом «composer dump-autoload» И еще — попробуй автолоад подключить вот так: require_once __DIR__ . ‘/vendor/autoload.php’;
1. где src слеш убрал, composer dump-autoload сделал, ничгео не изменилось 2. то что vendor/autoload.php у меня подключен верно, я проверял так — вывел вардамп в
вывод в браузере получил