Перегружать поведение count () при вызове определенных объектов

Возможный дубликат:
Элементы count для объектов, реализующих ArrayAccess с использованием count ()?

В PHP 5 вы можете использовать магические методы, перегружать некоторые классы и т. Д. В C ++ вы можете реализовать функции, которые существуют до тех пор, пока разные типы аргументов. Есть ли способ сделать это в PHP?

Пример того, что я хотел бы сделать, это:

class a { function a() { $this->list = array("1", "2"); } } $blah = new a(); count($blah); 

Я хотел бы, чтобы blah возвращался 2. IE подсчитывает значения определенного массива в классе. Поэтому в C ++ способ, которым я это сделаю, может выглядеть так:

 int count(a varName) { return count(varName->list); } 

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

 count($object); 

скорее, чем

 count($object->list); 

Список будет потенциально списком объектов, поэтому в зависимости от того, как он используется, это может быть действительно неприятное утверждение, если кто-то должен сделать это по-настоящему:

 count($object->list[0]->list[0]->list); 

Итак, могу ли я сделать что-то похожее на это:

 function count(a $object) { count($object->list); } 

Я знаю, что подсчет PHP принимает смешанный var, поэтому я не знаю, могу ли я переопределить отдельный тип.

Solutions Collecting From Web of "Перегружать поведение count () при вызове определенных объектов"

Похоже, вы хотите реализовать интерфейс Countable :

 class a implements Countable { public function __construct() { $this->list = array("1", "2"); } public function count() { return count($this->list); } } $blah = new a(); echo count($blah); // 2 

tl; dr – ответ внизу 🙂

В PHP эта модель отменяется; а не перегружать функции (а не методы) с разными типами аргументов, каждый класс предназначен для определения магических методов для каждой из этих функций.

Ниже приведен список функций, которые магия может быть определена для вашего класса. В примерах каждая ссылка на $obj является экземпляром вашего класса, ->unknown относится к отсутствующему свойству и ->blamethod() относится к отсутствующему методу.

  1. __toString() – этот метод вызывается, когда ваш объект используется в контексте строки, например, echo "My object is: $obj\n";

  2. __invoke([$arg1..n]) – когда ваш объект используется как функция, этот метод вызывается, например $obj($a, $b);

  3. __get($prop) – позволяет перехватить попытку доступа к несуществующему свойству вашего класса, например $obj->unknown ; Кстати, это иногда можно использовать как способ ленивой загрузки определенных свойств, которые в противном случае занимали бы значительную часть обработки, когда выполнялись в конструкторе.

  4. __set($prop, $value) – вызывается при установке несуществующего свойства, например $obj->unknown = 42;

  5. __isset($prop) – вызов для определения существования несуществующего свойства (я понимаю, как смешно звучит), например isset($obj->unknown) будет вызывать $obj->__isset('unknown')

  6. __unset($prop) – вызываемые в таких случаях, как эти unset($obj->unknown);

  7. __call($name, $arguments) – перехватывает вызов нереализованного метода вашего класса, например $obj->blamethod(1, 2, 3); будет вызывать $obj->__call('blamethod', array(1, 2, 3));

  8. __callStatic($name, $arguments) – как __call() но вы не сможете использовать $this внутри своей реализации.

  9. __clone () – вызывается при $x = clone $obj; вызывается, поэтому вы решаете, какие данные хранятся и что выброшено.

С SPL было введено еще несколько концепций посредством реализации определенных интерфейсов :

  1. Traversable – абстрактный интерфейс, который определяет, что делает ваш класс при использовании в конструкции foreach ; конкретный интерфейс называется Iterator .

  2. ArrayAccess – интерфейс, который позволяет использовать экземпляры вашего класса для использования как массив.

  3. Serializable – интерфейс, который определяет два метода для вызова serialize() или unserialize() . Это исключает использование __sleep() и __wakeup() .

  4. Countable – определяет один метод для вызова, когда count() выполняется в вашем экземпляре класса.