Red de conocimiento informático - Material del sitio web - ¿Qué se utiliza para atravesar objetos en PHP?

¿Qué se utiliza para atravesar objetos en PHP?

De hecho, Baidu te lo dirá.

Sabemos que en PHP, foreach puede iterar fácilmente sobre estructuras de iteración (como matrices y objetos):

[php]Ver texto sin formato

foreach( $array as $elem){

var _ dump($elem);

}

[php]Ver texto sin formato

foreach($obj as $clave = gt;$valor){

echo "$clave = gt$valor". PHP _ EOL

}

Entonces pensamos: ¿qué pasaría si buscamos un objeto instanciado?

Primero, definimos la clase base como:

[php]Ver texto sin formato

Prueba de categoría{

/*Un público Variable*/

Pública $a;

Pública $b;

/*Una variable privada*/

Privada $c;

Función pública __construct(){

$ this- gt; a = " public

$ this- gt; b = " public

$ this- gt; c = " privado

}

Función pública traverseInside(){

foreach($ this as $ key = gt; $ valor){

echo $key " = >. $valor. EOL

}

}

}

Luego creamos una instancia de la clase, la iteramos y la comparamos con el resultado de la iteración interna Para comparar:

[php]Ver texto sin formato

$test=nueva prueba;

echo "ltHR>"

echo "Atravesar afuera:". EOL

foreach($ prueba como $clave = gt; $valor){

echo $clave. " = >.$value.eol

}

echo "ltHR>";

echo "Atravesar dentro: ".eol

$ test- gt;traverseInside();

El resultado de la iteración es:

Se puede ver que el resultado del bucle foreach externo solo repite las propiedades públicas del objeto, pero el foreach externo no puede realizar un bucle de propiedades privadas. Por lo tanto, si desea buclear todas las propiedades (públicas y privadas) de la clase a través de foreach, no puede confiar simplemente en foreach y debe "transformar" la clase. Si conoce la implementación de foreach (referencia. blog de laruence:/2008/11/20/630. html), puede encontrar fácilmente la solución correspondiente. Por otro lado, también se menciona en "Conceptos básicos de patrones de diseño para objetos reutilizables". -Diseño de software orientado "que combina objetos. El acceso y el recorrido se separan del objeto y se colocan en un objeto iterador. El patrón iterador puede atravesar el objeto de diferentes maneras. No profundizaremos en el significado de esta oración por ahora, ya que siempre que sepamos que el objeto puede ser atravesado por iteradores.

Manual de PHP; Parte de él establece que para implementar el patrón iterador, se debe implementar la siguiente interfaz en el objeto iterador:

[php]Ver texto sin formato

abstractpublicmixedcurrent (void)

abstractpublicscalarkey(void)

abstractpublicvidnext(void)

abstractpublicvoidrewind(void)

abstractpublicbooleanvalid(void) )

Utiliza esto. Es conveniente implementar el patrón iterador. Un ejemplo simple es el siguiente:

[php]Ver texto sin formato

La clase TestIterator implementa el iterador {

private $ point = 0

<; p>privado $datos = array(

"Uno", "Dos", "Tres",

);

Función pública __construct() {

$ this-gt;point=0;

}

Función rebobinar() {

$ this-gt;point= 0 ;

}

Función actual(){

return $this-gt;data[$this-gt;point];

}

Tecla de función(){

return $ this- gt; point

}

Función siguiente() {

$ this- gt; point;

}

Función válida(){

return isset($ this- gt; data [ $this-gt;punto]);

}

}

$it = nuevo TestIterator

foreach($ es como $ clave = gt; $valor) {

echo $clave, $valor

echo "\n";

}

De Por supuesto, los objetos que usan iteradores se pueden recorrer a través de:

[php]Ver texto sin formato

$it = new TestIterator

$it-gt;rewind() ;

mientras($ it- gt;valid()){

$ clave = $ it- gt;clave();

$ valor = $ it- gt; actual();

echo " $ clave = gt$ valor "

$ it- gt(); /p>

Finalmente, aquí está la implementación de ListIterator en YII (como su nombre indica, un iterador que implementa operaciones de iteración de Lista):

[php]Ver texto sin formato

lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)

/**

* Archivo de clase CListIterator.

*

* @autor qiang.xue@gmail.com·Xue Qiang

* @link /

* @copyrightCopyright ? Yii Software Co., Ltd.

* @license/license/

*/

/**

* CListIterator es { @link CList} implementa un interactor.

*

*Permite que CList devuelva un nuevo iterador para iterar sobre los elementos de la lista.

*

* @autor qiang.xue@gmail.com·Xue Qiang

* @versión$Id$

* @ Paquete system.collections

* @Since 1.0

*/

La clase CListIterator implementa iteradores

{

/**

* @var matriz de datos para iterar

*/

Privado $_d;

/**

* @var El índice entero del elemento actual

*/

Privado $_I;

/**

* @var Recuento entero del elemento de datos

*/

private $_c;

/**

* Constructor .

* @param array $data los datos que se van a iterar

*/

Función pública_ _ construct(amp; $data)

{

$ esto- gt;_ d = amp$ datos

$ esto- gt;_ I = 0;

$ esto- gt;_ c = count($this- gt; _ d);

}

/**

* Rebobina el puntero de la matriz interna.

*Este método es necesario para los iteradores de interfaz.

*/

Función pública rebobinar()

{

$ this- gt;_ I = 0;

}

/**

* Devuelve la clave del elemento de la matriz actual.

*Este método es necesario para los iteradores de interfaz.

* @return entero la clave del elemento de matriz actual

*/

Tecla de función pública ()

{

return $this->_I;

}

/**

* Devuelve el elemento de la matriz actual.

*Este método es necesario para los iteradores de interfaz.

* @return elementos de matriz actuales mixtos

*/

Función pública actual()

{

return $this-gt;_d[$this-gt;_I];

}

/**

* Mover el puntero interno a la siguiente matriz artículo.

*Este método es necesario para los iteradores de interfaz.

*/

Función pública siguiente()

{

$ this- gt;_ i;

}

/**

*Devuelve si hay un elemento en la ubicación actual.

*Este método es necesario para los iteradores de interfaz.

* @return Valor booleano

*/

Función pública válida()

{

return $ esto- gt;_ i lt$ esto- gt;_ c;

}

}