[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Namespace
Страницы: 1, 2
user_name
Добрый день! Решил поменять структуру своего приложения. Идея такая, что каждый класс имеет свое пространство имен и оно равно директории где этот класс находится. Все классы подгружаются автоматически таким образом:

spl_autoload_register(function ($class) {
$path = dirname(__FILE__) . "/" . str_replace("\\", "/", $class);
spl_autoload($path);
});

Автозагрузчик находится в корне. И сразу возникла проблема со встроенным классом Exception Что бы подключить класс NotFoundPageException,который находится в /Core/ нужно задать ему namespace Core, тогда автозагрузчик сможет его подключить по такому пути Core/NotFoundPageException.

namespace Core;
class NotFoundPageException extends Exception {}

Проблема в том, что пространство имен распространяется на родительский класс Exception, в итоге:
Fatal error: Class 'Core\Exception' not found


Как можно решить эту проблему?
bestxp
вообще есть стандарт для этого дела

реализацию смотри как пример тут

https://github.com/php-fig/fig-standards/bl...ted/ru/PSR-0.md
или

https://github.com/php-fig/fig-standards/bl...der-examples.md

это дефакто соблюдение psr-0 psr-4 там все уже написано и не нужны велосипеды
на крайняк сгенерировать автозагрзку можно композером
user_name
О даже стандарты есть, круто,почитаю :)

Достаточно было указать абсолютный путь к Exception
 class NotFoundPageException extends \Exception {}

OleKh
Цитата (user_name @ 22.09.2015 - 15:21)
абсолютный путь к Exception

Обратил внимание на абсолютный путь и что-то показалось подозрительно, глянул в мануал и так и есть, правильно - абсолютное имя, т.к. абсолютный путь может быть к файлу, а в этом случае используется синтаксис пространства имен для доступа к глобальному классу.

Цитата
Обратите внимание, что для доступа к любым глобальным классам, функциям или константам, может использоваться абсолютное имя, такое как \strlen(), или \Exception, или \INI_ALL.
Guest

https://github.com/php-fig/fig-standards/bl...ted/ru/PSR-0.md
Не могу одного понять, зачем символ _ в имени класса преобразовывать в DIRECTORY_SEPARATOR unsure.gif
twin
Цитата (Guest @ 22.09.2015 - 19:28)
Не могу одного понять, зачем символ _ в имени класса преобразовывать в DIRECTORY_SEPARATOR

По стандарту PSR-0 классы должны были называться с указанием места расположения. Тоeсть класс Core_Library_Class должен был находиться по пути core/library/class.php

Сейчас это устаревший "стандарт", так как сейчас для указания пути используются немспейсы.

И вообще это никакой не стандарт, а рекомендация группы разработчиков, договорившихся придерживаться этих правил. Особенно в части реализации. Они сами пишут, что это примеры. А многие думают, что загрузчик может быть таким и только таким. Даже композеры юзают. smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Guest
Цитата
По стандарту PSR-0 классы должны были называться с указанием места расположения. Тоeсть класс Core_Library_Class должен был находиться по пути core/library/class.php

А в PSR-4 не совсем так, явно по названию класса не скажешь где он находится.

Цитата
Сейчас это устаревший "стандарт", так как сейчас для указания пути используются немспейсы.

Дак и для PSR-0 они используются. Я вообще удалил функцию замены _ на разделитель. И как то, нормально мне.. Хотя это уже не соответствует psr0
bestxp
Цитата (twin @ 23.09.2015 - 04:27)
Цитата (Guest @ 22.09.2015 - 19:28)
Не могу одного понять, зачем символ _ в имени класса преобразовывать в DIRECTORY_SEPARATOR

По стандарту PSR-0 классы должны были называться с указанием места расположения. Тоeсть класс Core_Library_Class должен был находиться по пути core/library/class.php

Сейчас это устаревший "стандарт", так как сейчас для указания пути используются немспейсы.

И вообще это никакой не стандарт, а рекомендация группы разработчиков, договорившихся придерживаться этих правил. Особенно в части реализации. Они сами пишут, что это примеры. А многие думают, что загрузчик может быть таким и только таким. Даже композеры юзают. smile.gif

Так любой стандарт есть рекомендации даже тот же ГОСТ или РСТ , если соответствует стандарту то стоит знак стандарта и это означает качество

если не хочешь использовать стандарты, то и не заикайся о качестве, все равно копать мало кому будет интересно, при условии не соблюдения стандарта
user_name
у меня почему то автозагрузчик не подключает мои классы. Подключил компусером Smarty. Получил папку vendor c пакетом. В корне проекта создал index.php подключил vendor/autoload.php там же подключаю смарти (new Smarty()) все ок. Создаю файл с классом в корне. Вызваю в индексе, ошибка - класс не найден. В чем может быть проблема?? huh.gif
twin
Цитата (bestxp @ 24.09.2015 - 06:47)
Так любой стандарт есть рекомендации даже тот же ГОСТ или РСТ

Стандарт стандарту - рознь. Допусим в Англии никому в голову не придет пользовать ГОСТ. А вот к примеру ISO уже серьёзнее.
Разработчики PSR это недвузначно отметили:
Цитата
The idea behind the group is for project representatives to talk about the commonalities between our projects and find ways we can work together. Our main audience is each other, but we’re very aware that the rest of the PHP community is watching. If other folks want to adopt what we’re doing they are welcome to do so, but that is not the aim.


Это вообще не вяжется с твоими смелыми заявлениями плана
Цитата (bestxp @ 22.09.2015 - 12:01)
psr-0
psr-4
включая реализацию, остальное велосипед


Соблюдение PSR еще не означает качество - раз, далеко не все его придерживаются - два. Ту же СМАРТИ вспомним. Или TWIG, раз про шаблонизаторы вспомнил.

Так что нравится - юзай. Только не нужно из PSR делать международный стандарт, а остальных объявлять велосипедостроителями. Да и инициаторов FIG действительно фиг да нифига. По сравнению с мировым сообществом. Вот когда PSR выйдет на уровень RFC, тогда да, это будет стандарт. А пока просто межсобойчик.

Полезный, не спорю. Но вовсе не обязательный буква в букву.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
user_name
Код надо смотреть)

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
user_name
index.php
require("vendor/autoload.php");
$smarty = new Smarty(); // Находит класс
$obj = new Front();// Не находит


Front.php
class Front {
function __construct() {
echo "string";
}
}


vendor
vendor/autoload.php
vendor/smarty/..
index.php
Front.php

Все просто. Не пойму что ему не так..
twin
А код загрузчика? vendor/autoload.php

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
user_name
vendor/autoload.php
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInit8a0972faeb5a2b5d39d7435cd4247861::getLoader();


vendor/composer/autoload_real.php

class ComposerAutoloaderInit8a0972faeb5a2b5d39d7435cd4247861
{
private static $loader;

public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}


public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}

spl_autoload_register(array('ComposerAutoloaderInit8a0972faeb5a2b5d39d7435cd4247861', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit8a0972faeb5a2b5d39d7435cd4247861', 'loadClassLoader'));

$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}

$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}

$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}

$loader->register(true);

return $loader;
}
}


function composerRequire8a0972faeb5a2b5d39d7435cd4247861($file)
{
require $file;
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.