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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> namespace 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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