php overloading countable

php - Sobrecargar el comportamiento de count() cuando se invoca en ciertos objetos



overloading countable (2)

Parece que quieres implementar la interfaz 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

Posible duplicado:
¿Contar elementos para objetos que implementan ArrayAccess usando count ()?

En PHP 5, puede usar métodos mágicos, sobrecargar algunas clases, etc. En C ++, puede implementar funciones que existan siempre que los tipos de argumento sean diferentes. ¿Hay una manera de hacer esto en PHP?

Un ejemplo de lo que me gustaría hacer es este:

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

Me gustaría que bla devuelva 2. IE cuenta los valores de una matriz específica en la clase. Así que en C ++, la forma en que lo haría podría verse así:

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

Básicamente, estoy tratando de simplificar las llamadas de datos para una aplicación grande, por lo que puedo llamar a hacer esto:

count($object);

más bien que

count($object->list);

La lista será potencialmente una lista de objetos, por lo que, dependiendo de cómo se use, podría ser una declaración realmente desagradable si alguien tiene que hacerlo de la forma actual:

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

Entonces, ¿puedo hacer algo similar a esto?

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

Sé que el recuento de PHP acepta una var. Mixta, así que no sé si puedo anular un tipo individual.


tl; dr - la respuesta está en la parte inferior :)

En PHP, este modelo se invierte; En lugar de sobrecargar funciones (no métodos) con diferentes tipos de argumentos, cada clase está destinada a definir métodos mágicos para cada una de esas funciones.

A continuación se muestra la lista de funciones para las que se puede definir el comportamiento mágico dentro de su clase. En los ejemplos, cada referencia a $obj es una instancia de su clase, ->unknown refiere a una propiedad que falta y ->blamethod() refiere a un método que falta.

  1. __toString() : este método se llama cuando su objeto se utiliza en un contexto de cadena, por ejemplo, echo "My object is: $obj/n";

  2. __invoke([$arg1..n]) : cuando su objeto se usa como una función, se llama a este método, por ejemplo, $obj($a, $b);

  3. __get($prop) : permite interceptar un intento de acceso a una propiedad no existente de su clase, por ejemplo, $obj->unknown ; por cierto, esto puede ser usado a veces como una forma de cargar de forma perezosa ciertas propiedades que de otra manera requerirían una cantidad considerable de procesamiento cuando se realizan en el constructor.

  4. __set($prop, $value) : se llama cuando se está estableciendo una propiedad no existente, por ejemplo, $obj->unknown = 42;

  5. __isset($prop) : se llama para determinar la existencia de una propiedad no existente (me doy cuenta de lo gracioso que suena), por ejemplo, isset($obj->unknown) llamaría $obj->__isset(''unknown'')

  6. __unset($prop) : se llama en casos como estos no establecidos unset($obj->unknown);

  7. __call($name, $arguments) : intercepta una llamada a un método no implementado de su clase, por ejemplo, $obj->blamethod(1, 2, 3); invocará $obj->__call(''blamethod'', array(1, 2, 3));

  8. __callStatic($name, $arguments) - como __call() pero no podrá usar $this dentro de su implementación.

  9. __clone() : se llama cuando $x = clone $obj; se llama, por lo que puede decidir qué datos se conservan y qué se desechan.

Con SPL, se introdujeron algunos conceptos más mediante la implementación de ciertas interfaces :

  1. Traversable : una interfaz abstracta que define lo que hace su clase cuando se usa en una construcción foreach ; La interfaz concreta se llama Iterator .

  2. ArrayAccess : una interfaz que permite usar instancias de su clase como una matriz.

  3. Serializable : una interfaz que define dos métodos a los que se debe llamar en serialize() o unserialize() . Es mutuamente exclusivo de usar __sleep() y __wakeup() .

  4. Countable : define un método al que se debe llamar siempre que se realiza count() en su instancia de clase.