Возможный дубликат:
Элементы 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, поэтому я не знаю, могу ли я переопределить отдельный тип.
Похоже, вы хотите реализовать интерфейс 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() относится к отсутствующему методу.
__toString() – этот метод вызывается, когда ваш объект используется в контексте строки, например, echo "My object is: $obj\n";
__invoke([$arg1..n]) – когда ваш объект используется как функция, этот метод вызывается, например $obj($a, $b);
__get($prop) – позволяет перехватить попытку доступа к несуществующему свойству вашего класса, например $obj->unknown ; Кстати, это иногда можно использовать как способ ленивой загрузки определенных свойств, которые в противном случае занимали бы значительную часть обработки, когда выполнялись в конструкторе.
__set($prop, $value) – вызывается при установке несуществующего свойства, например $obj->unknown = 42;
__isset($prop) – вызов для определения существования несуществующего свойства (я понимаю, как смешно звучит), например isset($obj->unknown) будет вызывать $obj->__isset('unknown')
__unset($prop) – вызываемые в таких случаях, как эти unset($obj->unknown);
__call($name, $arguments) – перехватывает вызов нереализованного метода вашего класса, например $obj->blamethod(1, 2, 3); будет вызывать $obj->__call('blamethod', array(1, 2, 3));
__callStatic($name, $arguments) – как __call() но вы не сможете использовать $this внутри своей реализации.
__clone () – вызывается при $x = clone $obj; вызывается, поэтому вы решаете, какие данные хранятся и что выброшено.
С SPL было введено еще несколько концепций посредством реализации определенных интерфейсов :
Traversable – абстрактный интерфейс, который определяет, что делает ваш класс при использовании в конструкции foreach ; конкретный интерфейс называется Iterator .
ArrayAccess – интерфейс, который позволяет использовать экземпляры вашего класса для использования как массив.
Serializable – интерфейс, который определяет два метода для вызова serialize() или unserialize() . Это исключает использование __sleep() и __wakeup() .
Countable – определяет один метод для вызова, когда count() выполняется в вашем экземпляре класса.