Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   [clases] No puedo acceder a propiedad protegida (https://www.clubdelphi.com/foros/showthread.php?t=39119)

Ñuño Martínez 11-01-2007 00:57:16

[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?

dec 11-01-2007 01:12:11

Hola,

¿Cuál es la onomatopeya del silbido? Pero no de un silbido cualquiera, o sea, no un silvido como si vas por la calle y alguien te silva... a lo lejos, sino un silvido de estos de "vaya", o "pero qué pasa... titi..." :)

Para ponerla aquí, lo digo. :D :D :D

Un intento: Fíuuu.

roman 11-01-2007 01:25:55

Creo que me quedé igual que dec y peor porque nunca he trabajado con php5. Pero fijándome en

Código PHP:

$this->$Text $Text 

al menos en php4 eso no es correcto. Lo es pero no es lo que quieres. Tendría que ser

Código PHP:

$this->Text $Text 

sin el $ después de ->.

Si $Text es, por decir algo, 'roman', entonces $this->$Text es como poner $this->roman.

A menos que algo haya cambiado en php5, quizá ahí esté el problema.

O igual no tiene nada que ver pero es que confieso que no leí todo el código y menos los resultados :o

// Saludos

dec 11-01-2007 01:35:21

Hola,

Pues tratando de decir algo al respecto...

Código PHP:

    if (isset ($this->ItemList)) {
      
$this->ItemList[count ($this->ItemList)] = $Item;
    }
    else {
      
$this->ItemList = array();
      
$this->ItemList[] = $Item;
    } 

Me parece más "lo suyo", ¿no? :D

Nota: que yo también uso el "$this->Variable" y no "$this->$Variable" como dicen Román y vengo haciendo... en PHP4, eso sí. :)

Ñuño Martínez 11-01-2007 11:41:33

Estoy avergonzado :o . Acabo de revisar la documentación de PHP5 y tenéis razón: sobra un carácter $. Olvidé por completo el tema de las variables variables... :o

Quitando los dólares que sobran funciona correctamente:
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)
  {
    
$this->ItemList[] = $Item;
    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 $Resultado $Elemento->toString ();
    }
    return 
$Resultado;
  }
}

# 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 ();
?>

Gracias a ambos por la ayuda.

roman 11-01-2007 13:38:14

Cita:

Empezado por Ñuño Martínez
Quitando los dólares que sobran funciona correctamente:

Lo cual prueba que el dinero no hace la felicidad :)

// Saludos

kayetano 11-01-2007 13:49:40

Hola

Cita:

Empezado por roman
Lo cual prueba que el dinero no hace la felicidad

Pues si quieres te ayudo a ser más feliz, solo tienes que mandarme el dinero que te sobre.

roman 11-01-2007 13:52:17

No, no. Es que la frase completa es:

El dinero no hace la felicidad, pero ayuda

:D

// Saludos

Ñuño Martínez 11-01-2007 14:24:13

Cita:

Empezado por roman
Cita:

Empezado por Ñuño Martínez
Quitando los dólares que sobran funciona correctamente:

Lo cual prueba que el dinero no hace la felicidad :)

Ya sabía yo que alguno picaba... :p:D


La franja horaria es GMT +2. Ahora son las 03:38:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi