(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Поддержка пространства имен в PHP 5.3. Примеры работы на ImageCMS

Источник: habrahabr
develop3r

Последние пять лет в истории PHP отличаются впечатляющими изменениями. Этот язык программирования развивается гораздо быстрее в области веб-программирования - релиз РНР 5.4 имеет большинство функций, необходимых в работе с современным веб-языком. Обеспечение поддержки пространства имен - одна из них. Возможность не из новых (php 5.3), но мы использовали ее в своей работе впервые. Собственным практическим опытом и жаждем поделиться.

Использование namespace решает проблему конфликтов, которая довольно часто беспокоит авторов модулей и библиотек. Пространство имен позволяет существовать двум файлам с одинаковыми именами (пока они находятся в разных каталогах), а также - способствует читабельности кода благодаря псевдонимам. Слово namespace используется для указания источника позиции в рамках текущего пространства или подпространства имен.

Что касается значимости пространства имен конкретно для компании "ImageCMS" - сторонние разработчики модулей отныне имеют возможность создавать автономные модули. Ведь вопрос удобства написания модулей никогда не может и не должен быть закрыт полностью. Но в некой степени те или другие задачи могут быть решены.

Несколько слов о том, что натолкнуло нас на это решение.


Скрипт ImageCMS работает на CodeIgniter. Фреймворк предлагал нам размешать свои библиотеки в " /application/libraries " и подключать к модулю с помощью Loader-класса. Такое ограничение заставляло писать мануалы по установке своего модуля с объяснением, куда размещать файлы для обеспечения работоспособности модуля. А если там уже есть файл с таким названием? Или имя класса? Нужно было заботиться об этом.

Мы обратились в IRC с вопросом о том, планируется ли в ближайшее время поддержка пространства именcodeigniter.com/irc/. Ответ предоставлен не был. Та же ситуация ждала нас на странице Changelog - ни намека на то, что вскоре будет сделано шаг в данном направлении. Только на форуме некоторые наработки выложены пользователями и один коммит на https://github.com, который дает возможность унаследовать "CI_Controller" (CI_Model почему-то упустили). 

Тот приятный факт, что 25.05 мы перешли на РНР 5.3, дал нам возможность самим прописать эти несколько строк для реализации поддержки пространства имен. 

Примеры внедрения namespace в систему ImageCMS


Приведенный ниже пример - далеко не последний для релиза системы. Он будет еще не раз переписан, протестирован и оптимизирован, но представленный прототип дает возможность посмотреть один из вариантов реализации поддержки namespace в PHP-проекте.

Добавим инициализацию в точку хука "pre_controller"

\application\config\hooks.php:

$hook['pre_controller'][] = array(
   'class' => '',
   'function' => 'modules_namespaces_initialize',
   'filename' => 'namespaceses.php',
   'filepath' => 'third_party/'
);

А вот, собственно, и сама инициализация

\application\third_party\namespaceses.php:

<?php
if (!defined('BASEPATH'))
   exit('No direct script access allowed');
 
function modules_namespaces_initialize() {
   if (!defined('PHP_VERSION_ID') // PHP_VERSION_ID < 50300)
       die('Namespaces requires PHP 5.3 or higher');
   spl_autoload_register('modules_namespaces_autoload', false);
}
 
function modules_namespaces_autoload($name) {
   if (strpos($class_name, "\\")) {        
       if (file_exists($file = 'application/modules/' . strtolower(str_replace('\\', DS, $name)) . EXT))
           require $file;
    }
}

Теперь у нас есть возможность реагировать на подключение классов через namespace.

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

Контроллер модуля

\application\modules\feedback\feedback.php:

<?php
use Feedback\Getuserlist as Getuserlist;

if (!defined('BASEPATH'))
   exit('No direct script access allowed');

class Feedback extends \MY_Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {
        $users = Getuserlist::getUsers();
        $this->template->add_array(array('users', $users));
        $this->display_tpl('feedback');
    }

}

Дальше нам понадобится файл getuserlist.php с классом Getuserlist

<?php
namespace Feedback;

if (!defined('BASEPATH'))
   exit('No direct script access allowed');

class Getuserlist extends \MY_Controller {

    function __construct() {
        parent::__construct();
    }

    public function getUsers() {
        return $this->db->get('users')->result();
    }

}

Такой подход к проектированию классов многие сочтут неудачным. Хочется отделить работу с базой данных. Значит нам нужно переписать метод getUsers() таким образом, чтобы он передал работу с базой данных модели, тем самым абстрагироваться от процесса подтягивания информации.

Новый метод теперь выглядит так:

public function getUsers() {
    return Model::getUsers();
}

ну и добавим псевдоним "Моdel":

use Feedback\Model as Model, 

Опишем модель для работы с базой данных:

<?php
namespace Feedback;

if (!defined('BASEPATH'))
   exit('No direct script access allowed');

class Model extends \CI_Model {

    function __construct() {
        parent::__construct();
    }

    public function getUsers() {        
        return $this->db->get('users')->result();        
    }

}

Теперь у нас есть класс, логика которого закрыта для обработчика "Getuserlist", а значит - разработка и поддержка кода становится более легкой.

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

Ссылки по теме:
http://www.php.net - namespaces
CodeIgniter
ImageCMS

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 03.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Raize Components 6
ABBYY Lingvo x6 Европейская Профессиональная версия, электронный ключ
TeeBI for RAD Studio Suite with source code single license
Microsoft 365 Business Basic (corporate)
IBM Rational Functional Tester Floating User License
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Новые материалы
Мастерская программиста
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100