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?