Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #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.000
Poder: 25
Ñ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?
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 11-01-2007 a las 00:59:32.
Responder Con Cita
  #2  
Antiguo 11-01-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.

Un intento: Fíuuu.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 11-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

// Saludos
Responder Con Cita
  #4  
Antiguo 11-01-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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?

Nota: que yo también uso el "$this->Variable" y no "$this->$Variable" como dicen Román y vengo haciendo... en PHP4, eso sí.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
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.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Estoy avergonzado . 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...

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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 11-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 11-01-2007
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
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.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #8  
Antiguo 11-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No, no. Es que la frase completa es:

El dinero no hace la felicidad, pero ayuda



// Saludos
Responder Con Cita
  #9  
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.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No puedo acceder a la búsqueda del foro Bicho La Taberna 7 13-09-2006 17:38:06
Clases derivadas kolo toure Varios 3 01-12-2004 21:43:31
Como puedo cambiar la propiedad de edicion y no edicion a un StringGrid1 ctronx Varios 2 25-06-2004 23:10:19
No puedo acceder remoto a IB wonder boy Conexión con bases de datos 1 23-03-2004 17:22:14
Conexion a BD Access 2000 protegida por cointraseña delphiladero Conexión con bases de datos 5 06-06-2003 23:36:41


La franja horaria es GMT +2. Ahora son las 16:35:58.


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
Copyright 1996-2007 Club Delphi