[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пространство имен
ApuktaChehov
Приветствую всех.

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

Представим некий код, который использует своё собственное пространство имен.
А сам фреймворк использует свое пространство имен.

В коде для наглядности:


//Сторонний код
namespace my;
class SomeUsesrClass {}

//Фреймворк
namespace fr;
class FrClass {}


Вот я хочу во фреймворке юзать сторонний класс.
Могу сделать так:

//Фреймворк
namespace fr;
class FrClass {

function test()
{
$user_class = new /my/SomeUsesrClass ();
}

}

Но это длинно, хочется так:
$user_class = new SomeUsesrClass();


При этом возникает желание добавлять пространства имен сторонних классов в какое-то вложенное пространство имен фреймворка типа: /fr/usersClass/

Вообще кто знаток, объясните как правильно работать с пространствами имен в данном контексте, что бы можно было добавить сторонний код, и что бы его можно было использвать во всей системе без дополнительных объявлений use, в каждом файле.

Спасибо.

_____________
bestxp
Ну например посмотри реализацию например у Ларавеля фасадов

а по сути пространство имен это часть названия класса
ранее мы писали My_ClassName теперь My\ClassName но удобство в том что мы в начале класса делаем use My\ClassName; в коде уже new ClassName или что-то подобноее

еще можешь подключить какой-нибудь сервис локатор и менеджер зависимостй и через него задать алиасы глобально, но и получать объекты по этим алиасам ты будешь из него

можешь генерировать файл с class ClassName extexnds Tr\Class;
и уже использовать их через загрузчик и тд
stump
Цитата
что бы его можно было использвать во всей системе без дополнительных объявлений use


После объявления пространства имен файла необходимо указать все пространства имен которые будут заюзаны с использование оператора use.

//Фреймворк
namespace fr;
use my\SomeUsesrClass,
my\SomeClass;

class FrClass {

function test()
{
$user_class = new SomeUsersClass ();
$user_class2 = new SomeClass ();
}

function static _test()
{
SomeClass::Class("!");
}
}


Или как ты себе представляешь "его использвать во всей системе без дополнительных объявлений use"?

_____________
Трус не играет в хокей
twin
Есть одна мудрость, не помню кто сказал. Каждая проблема - замаскированная удача.

Чем тебя так напугали use в каждом файле? Это же круто, это фактически принудительная дока. Сразу видно, где что искать. А написать пару символов, рука поди не отвалится)))

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

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

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

user posted image
Invis1ble
делать зависимости фреймворка от стороннего кода, да еще и посредством такого хардкода, - это изначально плохая задумка, имхо

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

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

bestxp - про алиасы можно по подробнее?


_____________
bestxp
Цитата (ApuktaChehov @ 3.04.2015 - 00:21)


bestxp - про алиасы можно по подробнее?

Все очень просто) управление зависимостями интересная штука и никогда не закончишь этим заниматься

тут просто имеем например массив

[
'MainClass' => '\Main\MainClass',
'SecondClass' => '\Main\SecondClass'
];


Далее имеем например метод
get($alias) {
$className = $aliases[$alias];
return new $className;
}


Минусы придется с 0 писать Di контейнер, и если не хочешь заморачиваться посмотри в сторону Pimple или Symfony\DependencyInjection

для простого не сложного проекта http://pimple.sensiolabs.org/ будет достаточно, притом что там всего лишь один простой класс и очень удобный ;)

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

_____________
chee
хотел тоже предложить вариант с DI, я испльзую его, код в итоге выглядит как то так

<?php

namespace ExampleCMS;

class Context implements Contract\Context
{

/**
*
@var Contract\Factory\Repository
*/

public $repositoryFactory;

/**
*
@var Contract\Factory\View
*/

public $viewFactory;

/**
*
@var Contract\Factory\Action
*/

public $actionFactory;

/**
*
@var Contract\Factory\Form
*/

public $formFactory;

/**
*
@var Contract\Factory\Card
*/

public $cardFactory;

/**
*
@var string
*/

protected $module;

public function getModel()
{
return $this->getRepository()->find($this->id);
}

public function getRepository()
{
return $this->repositoryFactory->get($this->module);
}

public function getView()
{
return $this->viewFactory->get($this->module, $this->view);
}

public function getAction()
{
return $this->actionFactory->get($this->module, $this->action);
}

public function getForm()
{
return $this->formFactory->get($this->module, $this->form);
}

public function getCard()
{
return $this->cardFactory->get($this->module, $this->card);
}

/**
*
@return Contract\Model
*/

public function getUser()
{
return $this->repositoryFactory->get('users')->getAuthUser();
}

public function getModule()
{
return $this->module;
}

public function setContextFromRouter(Contract\Router $router)
{
$this->module = $router->get('module');
$this->action = $router->get('action');
$this->form = $router->get('form');
$this->id = $router->get('id');
$this->view = $router->get('view');
$this->card = $router->get('card');
}

}



нет ни каких use , в di описано примерно так

'Context' => array(
'repositoryFactory' => 'Factory\Repository',
'viewFactory' => 'Factory\View',
'actionFactory' => 'Factory\Action',
'formFactory' => 'Factory\Form',
'cardFactory' => 'Factory\Card',
),



_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

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