Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Голосование

    Какую CMS Вы предпочитаете

    AtomX
    Fapos CMS
    Drunya CMS
Последние комментарии
Автор: чайник, в новости:

Что такое API и для чего они нужны

Автор: HIshnik, в новости:

Классы в PHP для чайников

Автор: Аноним, в новости:

Написание простого вируса в блокноте

Автор: stream, в новости:

Создаем BB коды на PHP

Топ пользователей
Drunya
Репутация: 108
Сообщений: 3527
Сашка_из_Шебекино
Репутация: 87
Сообщений: 1803
boriska
Репутация: 65
Сообщений: 846
ARMI
Репутация: 46
Сообщений: 1858
BAH0
Репутация: 26
Сообщений: 544
Часто бывает так, что нам необходимо иметь что-то типа супер глобальной переменной, которую мы могли бы использовать в любом месте нашего приложения. Не правда ли, удобно? Кто-то использует для этих целей супер глобальные массивы PHP, но это совсем не профессионально и лучше, если об этом никто не узнает.

Сейчас я хочу рассказать об одном из предопределенных интерфейсов PHP - ArrayAccess, который позволяет работать с объектами как с массивами, что очень удобно, а в связке с паттерном Singletone, мы получаем нечто вроде суперглобального массива для хранения чего угодно в нашем приложении.

Что такое интерфейс? Это нечто вроде указания, какие методы должны обязательно присутствовать в классе, который связан с интерфейсом. На пример интерфейс ArrayAccess обязывает нас иметь в своем классе четыре метода
 1 
 2 
 3 
 4 
 5 
<?php /* Methods */
abstract public boolean offsetExists mixed $offset )
abstract public 
mixed offsetGet mixed $offset )
abstract public 
void offsetSet mixed $offset mixed $value )
abstract public 
void offsetUnset mixed $offset )?>

А вот как будет выглядеть наш класс в связке с интерфейсом ArrayAccess
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
<?php class Reestr implements ArrayAccess {
    private 
$container = array();

    public function 
offsetSet($offset$value) {
        
$this->container[$offset] = $value;
    }
    public function 
offsetExists($offset) {
        return isset(
$this->container[$offset]);
    }
    public function 
offsetUnset($offset) {
        unset(
$this->container[$offset]);
    }
    public function 
offsetGet($offset) {
        return 
$this->container[$offset];
    }
}

//Теперь мы можем работать с объектом этого класса как с массивом
$Reestr = new Reestr;
$Reestr['key'] = 'value';
echo 
$Reestr['key']; //выведет value?>

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

Singletone позволяет предотвратить создание более чем одного объекта класса. При первом запросе, создается объек, а при остальных, нам просто возвращается указатель на уже созданный объект. Объясняю как могу, уж простите. Думаю сейчас поймете

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
<?php class Reestr implements ArrayAccess {
    private 
$container = array();

    private static 
$instance NULL;

    public static function 
getInstance() {
         if (
self::instance === NULL) {
              
self::instance = new self();
         }
         return 
self::instance;
    }

    public function 
offsetSet($offset$value) {
        
$this->container[$offset] = $value;
    }
    public function 
offsetExists($offset) {
        return isset(
$this->container[$offset]);
    }
    public function 
offsetUnset($offset) {
        unset(
$this->container[$offset]);
    }
    public function 
offsetGet($offset) {
        return 
$this->container[$offset];
    }
}

//Теперь важно создавать объект не как обычно а вызовом метода getInstance()

$Reestr Reestr::getInstance();
$Reestr['key1'] = 'value1';

// Теперь попробуем создать новый объект
$obj Reestr::getInstance();
echo 
$obj['key1']; //выведет value1

// так как $obj и $Reestr - это одно и тоже. Это и есть Singletone
?>



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

Важно учесть, что с объектом ArrayAccess мы можем работать как с массивом, только если речь идет о присвоении или выборке ключей, но функции для работы с массивами тут использовать не получится - возникнет ошибка.
Интерфейсы PHP. Объект - массив

Теги: паттерны программирования и разработки на php;
Автор: Drunya
Категория: PHP
Просмотров: 2258
Комментариев: 0

Сейчас online: 40. Зарегистрированных: 1. Гостей: 39.
-->