Ver Mensaje Individual
  #1  
Antiguo 11-01-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.025
Reputación: 27
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
[clases] No puedo acceder a propiedad protegida

Estoy intentando crear una clase con una propiedad protegida. Sin embargo me hace cosas muy raras. He simplificado el código al máximo:

Código PHP:
<?php

class phpDocTextItem
{
  protected 
$Text# Contiene el texto.

  ## __construct:
  ##   Constructor.  Almacena el texto pasado.
  
function __construct ($Text)
  {
    if (!
is_string ($Text)) die ('phpDocTextItem need to get a text string');
    
$this->$Text $Text;
  }



## toString:
##   Devuelve la cadena.
  
public function toString ()
  {
    echo (
'phpDocTextItem::toString: '); print_r ($this); echo ('<br>');
    return 
$this->$Text;
  }
}



class 
phpDocItemContainer
{
  protected 
$ItemList# El contenido del contenedor.

## addItem:
##   Añade un elemento a la lista.
  
public function addItem ($Item)
  {
  
# Primero intenté así:
  # $this->$ItemList[] = $Item;

  # pero como generaba errores de compilación, lo fui cambiando hasta que dejó
  # de dar errores. Esto es lo que quedó al final.
    
if (isset ($this->$ItemList)) {
      
$this->$ItemList[count ($this->$ItemList)] = $Item;
    }
    else {
      
$ItemList[0] = $Item;
      
$this->$ItemList $ItemList;
    }
    echo (
'phpDocItemContainer::addItem -> '); print_r ($this); echo ('<br>');
  }

## toString:
##   Devuelve una cadena que es la suma de todos los elementos contenidos.
  
public function toString ()
  {
    echo (
'phpDocItemContainer::toString -> ');print_r ($this); echo ('<br>');
  
# Primero, tiene que haber contenido.
    
if (isset ($this->$ItemList)) {
    
# Empezamos desde el principio.
      
$Resultado "";
      foreach (
$this->$ItemList as $Elemento)
    
$Resultado $Elemento->toString ();
    }
  }
}

# Creamos un contenedor para ver qué tal.
  
$Contenedor = new phpDocItemContainer;
# Añadimos un elemento, por hacer el ganso.
  
$Contenedor->addItem (new phpDocTextItem ('¡Hola, Mundo!'));
  
$Contenedor->addItem (new phpDocTextItem ('¡Adios, Mundo!'));
# Resultado:
  
echo 'Resultado >>>>>>>>> ' $Contenedor->toString ();
?>
En teoría el resultado buscado es:

Código:
phpDocItemContainer::addItem -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         (             [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Hola, Mundo!] => ¡Hola, Mundo!                 )          )  ) 
phpDocItemContainer::addItem -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         ( [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Hola, Mundo!] => ¡Hola, Mundo!                 )          , [1] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Adios, Mundo!] => ¡Adios, Mundo!                 )          )  ) 
phpDocItemContainer::toString -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         ( [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Hola, Mundo!] => ¡Hola, Mundo!                 )          , [1] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Adios, Mundo!] => ¡Adios, Mundo!                 )                    )  ) 
Resultado >>>>>>>>> phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Hola, Mundo!] => ¡Hola, Mundo!                 )
phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Adios, Mundo!] => ¡Adios, Mundo!                 ) 
¡Hola, Mundo!¡Adios, Mundo!
Sin embargo el resultado real es:

Código:
phpDocItemContainer::addItem -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         (             [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Hola, Mundo!] => ¡Hola, Mundo!                 )          )  ) 
phpDocItemContainer::addItem -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         (             [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Adios, Mundo!] => ¡Adios, Mundo!                 )          )  ) 
phpDocItemContainer::toString -> phpDocItemContainer Object (     [ItemList:protected] =>      [Array] => Array         (             [0] => phpDocTextItem Object                 (                     [Text:protected] =>                      [¡Adios, Mundo!] => ¡Adios, Mundo!                 )          )  ) 
Resultado >>>>>>>>>

Como ven, bastante diferente.

Yo ya no sé qué hago mal, ni por qué funciona. He consultado en http://www.php.net y según la documentación mi primer intento (que ahora está comentado) estaba bien, pero no funciona.

¿Alguien conoce la explicación?

Última edición por Ñuño Martínez fecha: 11-01-2007 a las 00:59:32.
Responder Con Cita