Skip to content

Countable interface

Февраль 8, 2012

Краткий пересказ поста с примерами.
Countable interface является частью SPL и описывает использование стандартной функции count() для объекта.
Все что вам нужно — это определить Countable::count() метод для своего класса таким образом, что бы он возвращал integer. Тогда при вызове функции count() php интерпритатор автоматически обратится к этому методу и выдаст соответствующий результат. Ниже приводятся несколько простых примеров использования интерфейса.

Доступ к защищенным или закрытым свойствам класса

Самый простой способ использования интерфейса Countable — это получить количество элементов массива, который определен как защищенное или закрытое свойство объекта.

class SomeClass implements Countable {

 protected $_data = array();

 public function doSomething()
 {
//Code to change $_data here
 }

 public function count()
 {
     return count($this->_data);
 }
}

В данном примере какие то данные хранятся в объекте в виде массива и метод Countable::count просто возвращает количество элементов этого массива.

Использование Countable как сигнал состояния объекта

Countable так же может использоваться как сигнал состояния объекта. Немного изменим пример выше:

class SomeOtherClass implements Countable {

protected $_data;

public function doSomething()
{
//Code to change $_data here
}

public function count()
{
return is_null($this->_data) ? 0 : 1;
}
}

В этом случае count() будет возвращать только 0 или 1, в зависимости от защищенного свойства $_data. Использовать этот код можно так:

$obj = new SomeOtherClass();

$obj->doSomething();

if (count($obj)) {

//$_data is not null, proceed accordingly.

}

Использование Countable с таблицой базы данных

Другим интересным применением Countable может послужить использование вместе с классом, который каким-то образом привязан к таблице базы данных. Представим ситуацию, когда в таблице актуальными считаются только те значение, для которых выполняется какое-то условие. Реализацией Countable для объекта, который инкапсулирует таблицу может выступать флаг актуальных значений таблицы. Для данного примера используем Zend_Db_Table:

class AnotherClass extends Zend_Db_Table implements Countable {

 public function count()
 {
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
->from('some_table', array('Count' => 'COUNT(*)'))
->where('SomeCondition = SomeValue');
$row = $this->fetchRow($select);
return (int) $row->Count;
 }
}

Пример использования класса:

$obj = new AnotherClass();

if (count($obj)) {

//Table has 'live' values. Do something here

}

Предостережение

Единственным ограничение использования Countable может быть только воображение разработчика, и это так же опасно. Все разработчики знакомы с использованием функции count() для определения количества элементов в массиве. При реализации Countable вы уходите от привычного использования метода count(), тем самым уменьшая интуитивное понимание кода и увеличиваете шанс допустить ошибку. Однако, это касается всех предопределенных интерфейсов. Они предоставляют огромные возможности, но, в то же время, уменьшают интуитивное понимание кода. Не позволяйте этому останавливать вас! В следующий раз, когда вы решите создать метод вроде getItemCount() в классе не делайте этого! Реализуйте интерфейс Countable вместо этого.

Реклама

From → PHP

2 комментария
  1. zlik permalink

    Колекція Magento, яскравий приклад:
    class Varien_Data_Collection implements IteratorAggregate, Countable

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: