Привет всем)) подскажите или направьте где почитать.. есть автозагрузка Код (Text): spl_autoload_register(function($className) { $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strrpos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; $fileName = __DIR__ . $fileName; if (file_exists($fileName)) { var_dump($fileName); require $fileName; } }); есть файл в проекте /models/File.php Код (Text): namespace models; class File { ..... } есть еще один файл /vendors/core/models/File.php Код (Text): namespace models; class File { ..... } как правильно обращаться к второму файлу, при том что namespace у него должен быть относительный а не абсолютный.. первый работает зашибись.. второй инклудится в автозагрузке... но пхп не видит его как класс.. везде где читаю - везде в общем.. а вот как такое решение сделать - не могу найти.. может гуглю не правильно.. Спасибо))
прям вот так и есть? неймспейс - моделс и там и там, и класс - файл (ВДРУГ!) и там и там? не взлетит потому что будет фаталка по редекларации класса.
да.. прям так и есть)).. одинаковые файлы с одинаковым относительным расположением.. но с разным абсолютным.. смотрю на Yii2 там пространство имен по другому реализовано, не так как у меня.. в вендорах там пространства имен отличаются от путей в проекте.. там через компосер идет автозагрузка.. и файлы явно инклудятся компосерным аутолоадом..
Ты не понял. Когда ты обратился к первому классу (и допустим автолод его успешно подгрузил) то в памяти появился класс с полным квалифицированным именем \models\File. Потом ты пытаешься обратиться к этому же классу. Он уже доступен. Ну допустим ты не умеешь автозагрузку и прописываешь руками подключение второго файла. А в нем описание класса с полным квалифицированным именем... \models\File. Того, который уже загружен в памяти... PHP Fatal error: Cannot declare class File, because the name is already in use in ... Поэтому я повторяю вопрос. У тебя точно два файла с одинаковым классом лежащим в одном нейпспейсе?
Да.. все точно так как я описал.. два одинаковый файла, оба лежат в директориях models только один в корне, а второй в vendors/core когда я подключаю класс из вендорса use vendors\core\models\File; то автозагрузка его грузит require но сам пхп выдает ошибку Fatal error: Uncaught Error: Class 'vendors\core\models\File' not found потому что там неймспейс иной чем в use вот у меня в связи с этим вопрос.. как коректно подключать такие вот классы с относительными неймспейсами..
да.. сразу попробовал.. Код (Text): use vendors\core\models\File as FileTemplate; $file = new FileTemplate;
Не такой алиас. Это ты написал "хочу во в этом данном файле не ломать пальцы и не копипастить vendors\core\models\File а обращаться по короткому имени - FileTemplate", а я говорю про class_alias
попробовал)) не хочет.. Код (Text): class_alias('blank\core\models\File', 'coreFile'); $file = new coreFile; путь сменил для того что бы эксперементировать.. все равно получаю Warning: Class 'blank\core\models\File' not found in хотя сам файл с классом инклудится отлично.. в тоже время если прописываешь в неймспейсе полный путь - все начинает работать...
Порядком. У меня в нескольких проектах порно из автолоадеров: 1. Собственно неймспейс проекта (\проект\) - в /либ/проект/ 2. Автосборка проекта (\проект\) - в /либ/билд/проект/ 3. Классы в глобальной области (* без \) - в /либ/глобал/ 4. Прототипы переопределений (\*\) - в /либ/контриб/*/ 5. Классы композитора (\*\) - в /либ/композер (их туда перекладывает сам композер из папки /вендор/) Запрос \Проект\Секция\Класс - отработает №1. Если не найдет класс - отработает №2. №4. №5. Далее ошибка. Запрос \КакойТоПСРНольКласс - отработает только №2. Иначе - ошибка. Запрос \Вася\Огнемёт - в №4 поищем есть ли переопределение. Иначе посмотрим в №5 и потом ошибка. И так далее. Короче знаю толк в извращениях. Но суть прежняя - автолоадеры исполняются в порядке встречи объявлений при выполнении скрипта.
тогда странно как то реализованы неймспейсы... хочу взять чужой класс, и что получается надо прописывать в нем свои неймспейсы..
Но ведь ещё есть наследование. Берешь чужой класс, расширяешь его своим, используешь свой. даже не обязательно каким-то кодом наполнять это расширение. просто майкласс экстендс вендоркласс {}
Почему не можешь наследовать? Вендор придумал класс, разместил его в своём неймспейсе. Ты придумываешь надстройку, размещаешь в своём неймспейсе. Обращаешься к своему - автолоадер этот файл подключает, класс требует зависимость, автолоадер и этот файл подключает. Я как-то не особо вникаю в чем проблема.
я не понял чем эта автозагрузка мне поможет?? вроде тоже самое только пути указаны явно для некоторых классов.. фишка в том что автозагрузчик мой видит этот файл когда я пытаюсь создать объект даже удачно иклудит его.. но дальше говорит что не могу найти класс... как только я в этом классе меняю неймспейс на полный путь.. - тогда все зашибись.. вот я отключаю все автозагрузки и делаю вот так вот.. Код (Text): $file = include __DIR__ . '\blank\core\models\File.php'; var_dump($file); //int 1 $file = new File; т.е. файл инклудится но изза того что там не полный неймспейс - пхп его не видит как класс.. если убираю из файла вообще неймспейс - то все отлично работает.. неужели никто никогда с подобной задачей не сталкивался..
Создавай объект включительно с наймспйсе в имени класса, может поможет. Или use до объявления класса, где используешь тот класс. Если я все правильно понял, должно помочь.
пытался так сразу сделать.. тоже самое.. и так Код (Text): $file = new blank\core\models\File; и так Код (Text): use blank\core\models\File; $file = new File; файл весело инклудится - а потом пхп говорит что все плохо.. --- Добавлено --- Вот смоделировал ситуацию)) кому интересно скачайте посмотрите) --- Добавлено --- хоть одновременно хоть не одновременно все равно не получается.. выше пример дал.. мне вообще идеально было бы наследоваться от того который в вендорсах..
use указывает какой неймспейс нам использовать... в файле /vendors/core/models/File.php он указан от корня /vendors/core/ а я указываю в use полный путь. .я понимаю что это вроде не правильно. . но в документации что то писали про относительные пути, я тешу себя надеждой что они все таки должны работать)
@Алекс8, в самом PHP namespace никак не связан с путями к файлу, и может быть по любому пути любой. Это уже изобретение программистов - привязать неймспесы к путям, интерпретатор про это нихрена не знает. Поэтому во всех файлах должен быть полный namespace
то есть в данном конкретном примере если у двух файлов одинаковые неймспейсы я никак не могу обеими классами воспользоваться?? печалька.. .