Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> namespace 
:(
    Опции темы
Sanchezzz
Дата 27.8.2013, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Подскажите с пару вопросами. 

Есть собственный двиг сейчас с переводом проекта на namespace возник вопрос.
Cтоит делать для приложений отлетное namespace от двига? 

Целью использования namespace послужили след мотивации с моей стороны.
1) это сократить проверки в autoload  к минимум использовать имя пространства как путь.
2) разделить двиг на отдельное пространство да бы дать возможность использовать те имена классов которые захочется
3) Подключать компоненты симфонии - ZD2 итд... 
4) Пара двигаться дальше использовать все плюшки и пряники 5.4+

Это сообщение отредактировал(а) Sanchezzz - 27.8.2013, 23:46


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Gold Dragon
Дата 28.8.2013, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



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

А вот в очередной раз возвращаться к этому заставляет меня только это утверждение
Цитата(Sanchezzz @  28.8.2013,  00:42 Найти цитируемый пост)
4) Пара двигаться дальше использовать все плюшки и пряники 5.4+



PS
может в очередной раз меня переубедят ;)



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 28.8.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Gold Dragon, я также как и вы брался по несколько раз за это дело  (3) и с каждым разом как г... в прорубе метался туда обратно, у меня хоть и не 1к файлов но за ночь перевел проект, пока в рабочем состояние. 

Вся соль это использовать namespace как путь в autoload

Код

    $is_namespaced = ($pos = strripos($class, '\\')) !== false; 
    
    $class = ltrim($class, '\\');
    $class = str_replace(array('/', '\\',), DIRECTORY_SEPARATOR , $class);
    // Проверяем namespace на путь...
    if($is_namespaced){
        $path = dirname(__FILE__) . DIRECTORY_SEPARATOR . ".." .  DIRECTORY_SEPARATOR . ".." .  DIRECTORY_SEPARATOR . $class . ".php";
        if(is_file($path)){
            include_once $path;
            return class_exists($class,false);
        }
    }


Это сообщение отредактировал(а) Sanchezzz - 28.8.2013, 08:59


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 28.8.2013, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sanchezzz @  28.8.2013,  08:58 Найти цитируемый пост)
Вся соль это использовать namespace как путь в autoload

Решение, imho, нужное. Оно удобно и разумно, если речь идет о разработке плагина в определенную систему. Бросаем класс в каталог в "пути поиска" файлов проекта и имеем простоту смены версии плагина. 
Опять же, "автоматически", получается непересекающиеся в проекте имена классов. Имя плагина уже входит префиксом-неймспейсом в имя класса.

С другой стороны, если плагин будет использоваться в разных, в том числе и старых, проектах, получается тот еще геморрой.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 28.8.2013, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



ksnk,  Да всегда есть трабы, когда нужно внедрить в старый проект, что-то с нового, особенно если процесс эволюции кода проекта ушел далеко вперед. 

Gold Dragon,  Наверняка есть такие места где можно не указывать namespace 
у меня такие места появились, это непосредственно созданные контроллеры и модули, единственное extends нужно прописывать с namespace ну и use какие классы нужно импортировать. 



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Gold Dragon
Дата 28.8.2013, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(Sanchezzz @  28.8.2013,  10:50 Найти цитируемый пост)
Gold Dragon,  Наверняка есть такие места где можно не указывать namespace 
скорее наоборот smile 

Так что пока никак не могу себе придумать актуальность.. Что касается autoload, ну может ты и прав, надо поразмыслить... Просто пока не могу осознать это применительно к своим проектам.

PS
а какой смысл вообще использовать  DIRECTORY_SEPARATOR? Юниктовые системы используют / а винде вообще пофиг. Просто ставить слеш и не мудрить?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 28.8.2013, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

а какой смысл вообще использовать  DIRECTORY_SEPARATOR?

Если винда или *nix-оси то смысла нету, особенно для винды все ровно какой  путь и какой регистр имен файлов.

DIRECTORY_SEPARATOR зависит от платформы и php как кросплатформенный язык обязан иметь такую константу) 

В общем хочешь используй, хочешь не используй.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Gold Dragon
Дата 28.8.2013, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(Sanchezzz @  28.8.2013,  21:40 Найти цитируемый пост)
В общем хочешь используй, хочешь не используй. 
перестал использовать, писать много да и строчки длинные  smile 

А что касается автозагрузки классов, то я использую в некоторых случаях простой INI-файл с настройками по типу 
Код

; [группа класса]
;     название файла = 'имя класса'
;=======================================

;---------------------------------------
; Ядро
;---------------------------------------
[core]

; Основное ядро
gdlotos = 'GDLotos'

; Конфигурация
config = 'GDLConfig'

; Управление пользователями
user = 'GDLUser'

; Управление базой данных
database = 'GDLDatabase'

; Управление сессиями
session = 'GDLSession'

; Управление шаблонами
template = 'GDLTemplate'

; Управление кэшем
cache = 'GDLCache'

; Управление ошибками
exception = 'GDLException'

;---------------------------------------
; Библиотеки
;---------------------------------------
[library]

; Работа с INI-файлами
ini = 'LibIni'

; Работа с языковыми файлами
lang = 'LibLang'


Так что мне кажется снова появился смысл использовать NAMESPACE smile только нужен реально работающий код примера ну и понятный 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 28.8.2013, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



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

Добавлю тогда просто личный пример. 
Проектик на ранней стадии разработки. Все сделано на неймспейсах. Более 50 классов и более 30 директорий (с учетом вложенных). Используется namespace-based класс-лодер. При всем этом в конфигах прописаны только 5 корневых ("основополагающих") неймспейсов (что-то вроде: контролеры, модели, плагины, сервисы, пользовательские классы). Все классы расположены по путям, соответствующих их неймспейсам и подгружаются, фактически, автоматически, исходя из директорий корневого неймспейса. Любой интересующий разработчика класс находится моментально.
В целом напоминает структуру в Java. Правда, в отличие от нее, в файл можно запихнуть больше одного класса =)

Но лично мне это нравится больше за частую неразбериху в классах. При использовании нейспейсов разработчик косвенно обязуется создать валидный путь к файлу, соответствующий неймспейсу, и назвать файл именем класса.
А то уже был у меня случай, когда в файле типа "класс.php" встретил "Класс_С_Очень_Замутным_Названием"

Namespace. Снижает уровень екстрасенсинга более, чем на 50%! smile 



--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Sanchezzz
Дата 28.8.2013, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



"Класс_С_Очень_Замутным_Названием"  ага напоминает стиль ZEND без namespace пример Zend_Search_Lucene_Search_Weight_Boolean где полный путь до файла Zend/Search/Lucene/Search/Weight/Boolean/Zend_Search_Lucene_Search_Weight_Boolean.php

Не не лучше namespace и четко ретуал соблюдать.

Я стараюсь больше 2-3 суб namespace нечего не строить принцип Yii2
Код

namespace Yii\base;
use Yii;
class Controller extends Component { // так как Component из NS Yii\base NP указывать не нужно.

}

Просто не нужно мудрить с большим количеством папок достаточно 2-3;


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 29.8.2013, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Arantir @  28.8.2013,  21:18 Найти цитируемый пост)
Любой интересующий разработчика класс находится моментально.
Цитата(Arantir @  28.8.2013,  21:18 Найти цитируемый пост)
Namespace. Снижает уровень екстрасенсинга более, чем на 50%!  

А нормальный IDE (phpStorm) не устраняет надобность в квалифицированном экстрасенсе? Он и сам сообразит в каком файле какой класс.

Этот явовский принцип "один класс - один файл", применительно к php меня раздражает. Понятно, что для Java это не влияет на эффективность, компилятор скомпилирует, а для php раскидать проект еще в  пару десятков файлов - может сказаться на скорости выполнения, если акселераторы не вкручивать.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 29.8.2013, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  29.8.2013,  08:09 Найти цитируемый пост)
А нормальный IDE (phpStorm) не устраняет надобность в квалифицированном экстрасенсе? Он и сам сообразит в каком файле какой класс.
 smile я пользуюсь штормом, вообще не вижу проблем ни с классами ни с функциями. Понятно что это проблемы тех кто до сих пор считает самой лучшей средой разработки блокнот smile

Ну нет у меня проблем с названиями smile Вот я и считаю, что на данном этап namespace в php как-то не доработан. Кроме как для красивости кода, пока актуальности не вижу.. 

Вотпосидел поразмышлял над автозагрузкой классов.. в конечном итоге получилось ни чем не проще простого INI-файла (и то INI-файл для сложных проектов)


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 29.8.2013, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(ksnk @  29.8.2013,  06:09 Найти цитируемый пост)
А нормальный IDE (phpStorm) не устраняет надобность в квалифицированном экстрасенсе?

Это была шутка юмора такая  smile 

Цитата(Sanchezzz @  28.8.2013,  21:22 Найти цитируемый пост)
Просто не нужно мудрить с большим количеством папок достаточно 2-3; 

Зависит от обстоятельств. 
Мультимодульность, структура моделей, иные логические разграничения... Веб-приложения бывают самого разного уровня сложности.
Например:
Module\MyModule\Model\Frontend\Forum\Thread
Module\MyModule\Model\Frontend\Forum\Reply
Module\MyModule\Model\Backend\Account\Account
Module\MyModule\Model\Backend\Account\Settings

Module - подключаемые модули.
MyModule - конкретный модуль.
Model - модели.
Frontend - модели веб приложения.
Backend - модели некого удаленного сервера.
Дальше структура самих моделей.

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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Sanchezzz
Дата 29.8.2013, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

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

Для большого винегрета при частом использование полного пути NP предусмотрены алиасы, что-бы не ###ывало. 

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

Дальше создаем в наследуемом классе типа $this->aliasModel('.Frontend.Forum.Thread') , который вернет экземпляр.
Можно для текущего модуля сделать карту  алиасов более короткого имени.
Для вызова моделей их другого модуля тут придется писать уже полный путь алиаса в этом методе или использовать явный вызов по NP и доверить дело autoload

Разработчик уже сам решит как это использовать.

Это сообщение отредактировал(а) Sanchezzz - 29.8.2013, 10:46


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Gold Dragon
Дата 29.8.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(Sanchezzz @  29.8.2013,  11:45 Найти цитируемый пост)
Например контроллер знает откуда был вызван из какого модуля, модуль знает свой полный путь. 
что-то малость не понял.. А если я вызываю класс совсем из иного места? Модуль может быть и знает, но вот только путь то получится не корректный



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 29.8.2013, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(Gold Dragon @  29.8.2013,  12:05 Найти цитируемый пост)
А если я вызываю класс совсем из иного места? Модуль может быть и знает, но вот только путь то получится не корректный

Не надо слишком конкретизировать. То была только абстрактная идея, а Вы уже в ней баги ищите =)

use отлично разрешает большинство ситуаций.
Код

namespace Module\MyModule\Controller;

use Framework;
use Module\MyModule\Model; 

class Index extends Framework\BlaBlaBla\Controller {

Теперь внутри этого класса модели именно этого модуля доступны в простом виде Model\ClassName. То есть он знает "свои" модели. И откуда этот класс не вызывай, все будет работать. PHP разрулит нейспейсы как надо.

Это сообщение отредактировал(а) Arantir - 29.8.2013, 13:18


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Gold Dragon
Дата 29.8.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(Arantir @  29.8.2013,  14:17 Найти цитируемый пост)
Не надо слишком конкретизировать. То была только абстрактная идея, а Вы уже в ней баги ищите =)

что значит баги? мне нужно конктретное решение, а не абстракция. Как я прикручу абстракцию к своему проекту? smile

И опять же, при чёткой структуре может это и интересно.. Но ведь есть не только "модельная" структура и классы можут располагаться совершенно по иной логике и вызываться по иному..


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 29.8.2013, 14:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(Gold Dragon @  29.8.2013,  12:54 Найти цитируемый пост)
мне нужно конктретное решение, а не абстракция. Как я прикручу абстракцию к своему проекту?

С неймспейсами все просто. Создается список папок, откуда начинаются корневые неймспейсы
Код
Controller      = ../app/controllers/
Model           = ../app/models/
Plugin          = ../app/plugins/
. Переопределяется автолодер, в нем берется директория по первому неймспесу и к ней прилепляется оставшаяся часть всего неймспейса. 
Все. Дальше PHP все сам сделает, он всегда сует в автолодер "fully qualified name" класса. Остается только создавать файлики с именами классов, прописывать им желаемый неймспейс и класть в соответствующую директорию. Все будет грузиться само, как в Java. После этого структура ограничивается лишь фантазией.
В идеале можно даже создать единственный корневой неймспейс Application, соотнести ему корень проекта и не парится.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ksnk
Дата 29.8.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Есть некая PHP Framework Interoperability Group, которая пытается навести порядок в самодеятельном php программировании, путем навязывания сообществу стандартов программирования.
В частности PSR-0 достаточно удачная попытка  навязать стандарт на неймспейсы и организацию автолода. Во всяком случае, чем мастерить собственный стандарт, лучше присмотреться к чужому, у которого неплохие шансы стать "общепринятым".


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 29.8.2013, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



вот смотрю и что-то это совсем на бред стало похоже..

Если namespace это тоже самое (ну или почти) что и путь, то не проще ли получить путь файла разложить его как угодно
был /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php 
стал  \Doctrine\Common\IsolatedClassLoader

Вот в принципе о чём говорит эта группа и вообще мне кажется весь разговор  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 29.8.2013, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(Gold Dragon @  29.8.2013,  19:16 Найти цитируемый пост)
то не проще ли получить путь файла разложить его как угодно

Дело в том, что сначала PHP узнает про класс, а потом ищет его в файле/файлах, а не наоборот - парсит 1оо5оо файлов и создает из них классы.



--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Gold Dragon
Дата 30.8.2013, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну например что-то такое придумать

Код

spl_autoload_register(array('GDLAutoloader', 'Init'));

class GDLAutoloader
{
    public static function Init($class_name = '')
    {
        echo array_pop(get_included_files());

        // Далее разбираем путь и имеем NAMESPACE 
    }
}

так как вызов будет осуществлён из последнего подключенного файла то мы всегда будем иметь адрес этого файла


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 30.8.2013, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  30.8.2013,  08:06 Найти цитируемый пост)
так как вызов будет осуществлён из последнего подключенного файла то мы всегда будем иметь адрес этого файла 

Мне представляется, что в последовательности
Код

include "a.php";
include "b.php";
include_once "a.php";

print_r(get_included_files());

последним включенным файлом будет b.php, а не a.php

А так - забавная функция, ее можно пристроить к автоматическому построителю карты отображения классов в скрипты системы. Другого применения придумать пока не удалось.
P.S. Не, нельзя пристроить даже и к этому...
Не знаю, зачем она нужна  smile  

Это сообщение отредактировал(а) ksnk - 30.8.2013, 08:52


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 30.8.2013, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  30.8.2013,  09:45 Найти цитируемый пост)
Не знаю, зачем она нужна  smile  
трассировка

В общем получается что узнать путь из которого вызван класс можно только через NAMESPACE? но мне кажется есть какая-то функция в PHP



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 30.8.2013, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Применение только одно  это получить те пути которые есть в include_path отсортировать удалить повторения и включить в  них новый путь.

Что то такое 
Код

// Получаем колбасу
$paths =  array_unique(explode(PATH_SEPARATOR,get_include_path()));
if (array_search ( 'Добавляем новый путь ' , $paths ) === false) {
    array_push ( $paths, 'Добавляем новый путь ' );
}
// Добавляем всю колбасу обратно
set_include_path ( implode ( PATH_SEPARATOR, $paths ) );

Но этот способ подходит для классов в виде MYCLASS.PHP без namesapce

Для NP которые не повторят файловый путь, лучше всего это массивная карта чем перебор директорий. 

Это сообщение отредактировал(а) Sanchezzz - 30.8.2013, 10:07


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 30.8.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  30.8.2013,  09:23 Найти цитируемый пост)
В общем получается что узнать путь из которого вызван класс можно только через NAMESPACE, но мне кажется есть какая-то функция в PHP

C чего возникло желание узнать путь по имени класса? Обычно эта задача уже решена, своеобразно, в слое autoload-функций, почему бы не скопировать оттуда?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 30.8.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  30.8.2013,  11:09 Найти цитируемый пост)
C чего возникло желание узнать путь по имени класса? 
ну если считать что "рекомендации" советуют обзывать namespace как и путь, точему бы просто не разложить путь

Цитата(ksnk @  30.8.2013,  11:09 Найти цитируемый пост)
Обычно эта задача уже решена, своеобразно, в слое autoload-функций, почему бы не скопировать оттуда? 
это как?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 30.8.2013, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  30.8.2013,  10:33 Найти цитируемый пост)
это как?

Вот так, примерно, у меня сделано
Код


new \vendor\myPlugin\myClass ;
...

function autoload($name){
     $x=ltrim(str_replace('\\','/',$name),'/');
     $paths=ENGINE::option('include_path');
     foreach($paths as $path) {
           if(is_readable($path.$x.'.php')) {
                 include($path.$x.'.php');
           }
     }
}

Просто повторить перебор "базовых" каталогов, если он есть. 

Это сообщение отредактировал(а) ksnk - 30.8.2013, 11:03


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 1.9.2013, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Есть такая структура приложений по умолчанию. 

app/frontend  --сайт
  modules
     <name>
         controllers
         models
         // cуб модули > N 
         modules
            <name>
  models
  controllers
app/backend  --админка по структуре также как и в  frontend  
app/common  --общая часть

Как лучше из след. 2х вариантов поступить для NP

1
Писать полностью NP от корня например для модуля crud придется задать такой NP app/frontend/modules 
Из плюсов и минусов:
[+] Даст вызов нужных нам модулей по NP из любого приложения.
[-] сделает переносимость модулей без правки namespace не обойтись.

2
Делать NP от текущей базовой папки приложения, например если мы в frontend  то это /app/frontend/ если это модуль crud из первого варианта то базовая директория становится app/frontend/modules/crud
Дальше NP отталкиваются от базовой папки. Что это дает:
[+] Переносимость модулей в любое другую папку приложения, нету привязки жёсткой к пути даже для субмоделй вложеных в друг друга. 
[-] Невозможно вызвать контроллер из другого приложения

Это сообщение отредактировал(а) Sanchezzz - 1.9.2013, 20:09


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.