Не видит класс php

Почему 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
Ясно, что ищется не там. ((

delphinpro

namespace Blackjack; $e = new ClasFrom_dbclass;

Неймспейс видно? Ну вот в нем и проблема
Ваш класс запрашивается как ClasFrom_dbclass , в текущем неймспейсе \Blackjack . Значит полное название класса \Blackjack\ClasFrom_dbclass . А на самом деле класс ClasFrom_dbclass видимо расположен в глобальном пространстве имен. Значит и обращаться к нему нужно соответственно $e = new \ClasFrom_dbclass; (внимание на слэш).

Читайте также:  2000 htm 2000 html

coderisimo

Спасибо за идею! а если в начале написать use \ClasFrom_dbclass as ClasFrom_dbclass , мы же сможем использовать его стандартным способом? $e = new ClasFrom_dbclass;

delphinpro

coderisimo: Можно, но зачем? Слэш вроде не сложно дописать для классов в глобальном пространстве имен. «Стандартный» способ — это как раз с указанием неймспейса )

Источник

Почему на хостинге не видит класс?

5f90782f154ae647520277.png

Вот структура проекта:

В проекте использую автозагрузчик 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 комментарий

Читайте также:  Php null safe operator

Источник

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 у меня подключен верно, я проверял так — вывел вардамп в

вывод в браузере получил

Источник

Оцените статью