Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Aprendiendo POO me he topado con un error con public

Estas en el tema de Aprendiendo POO me he topado con un error con public en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a tod@s, hace poco me he comprado un libro de PHP5 "PHP5 - Manuales imprescindibles de Anaya ISBN: 84-415-1785-1" Y lo primero que he ...
  #1 (permalink)  
Antiguo 08/03/2007, 07:20
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Aprendiendo POO me he topado con un error con public

Hola a tod@s, hace poco me he comprado un libro de PHP5 "PHP5 - Manuales imprescindibles de Anaya ISBN: 84-415-1785-1" Y lo primero que he hecho ha sido empaparme del "Capitulo 9: Programación orientada a objetos"... Me lo he leido entero y repasado, los dias siguientes. Aunque sé que estoy muy verde todavía.

Bueno el caso es que despues de leer me he puesto a probar una cosita que me reconcomia jejeje... Y es la herencia encadenada... Pues yo siempre habia pensado que como no es herencia multiple, lo que es la herencia encadenada tampoco se podia hacer. Pero he visto que si.

Entonces, me he puesto manos a la obra y he hecho 3 clases ('A', 'B' y 'C') de tal forma que 'C' hereda de 'B' y esta hereda de 'A'. Con la intención de ver si la visibilidad de los miembros de 'A' llega a 'C'. es decir, si la herencia pasa de 'A' a 'B' y 'C'.

Antes de poner el codigo voy a poner las versiones del server, apache, php, extensiones etc...
Cita:
Packages:
Apache 2.0.59
PHP 5.2.0
Mysql 5.0.27
SQLite 3.3.8
PhpMyAdmin 2.9.1.1
SQLiteManager 1.2.0
ZendOptimizer 3.2.0

Loaded PHP extensions:

bcmath, calendar, com_dotnet, ctype, session, filter, ftp, hash, iconv, json, odbc, pcre, Reflection, date, libxml, standard, tokenizer, zlib, SimpleXML, dom, SPL, wddx, xml, xmlreader, xmlwriter, apache2handler, mbstring, bz2, curl, gd, mysql, mysqli, openssl, PDO, pdo_mysql, pdo_sqlite, Zend Optimizer
Y el codigo para probar... lo he hecho así:
Código PHP:
class {
    
// Atributos
    
public $variableA
    
    
// Metodos
    
public function setVariableA($variableA) {
        
$this->variableA $variableA;
    }
    public function 
getVariableA() {
        return 
$this->variableA;
    }
}
class 
extends {
    
// Atributos
    
public $variableB
    
    
// Metodos
    
public function setVariableB($variableB) {
        
$this->variableB $variableB;
    }
    public function 
getVariableB() {
        return 
$this->variableB;
    }
}
class 
extends {
    
// Atributos
    
public $variableC
    
    
// Metodos
    
public function setVariableC($variableC) {
        
$this->variableC $variableC;
    }
    public function 
getVariableC() {
        return 
$this->variableC;
    }
}

// Llamamos a los objetos miembros de la clase A
    
    
$objA = new A();
    
$objA->setVariableA("Esta es la variable A.<br />");
    
$objA->getVariableA();
    
    
// Llamamos a los objetos miembros de la clase B
    
    
    
    
// Llamamos a los objetos miembros de la clase C 
No llamo a los siguientes objetos de 'B' y 'C' en el codigo por que me ha dado un error, que no entiendo. Parece ser algo simple, pero supongo debo ignorar algo... Vosotros seguro que nadamás verlo sabeis donde la estoy cagando xD... Si fueseis tan amables de decirme o ya que es mi primer codigo POO orientarme un poco... si voy bien o si la estoy liando a saco... xD Seria de agradecer jeje ;)

Bueno os pongo el error que me da con el "public"...

Cita:
Parse error: parse error, unexpected T_PUBLIC, expecting ',' or ';' in E:\Instalaciones\vertrigo\VertrigoServ\www\oop.php on line 7
Espero vuestra respuesta ;)
y gracias de antemano.
  #2 (permalink)  
Antiguo 08/03/2007, 07:27
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 8 meses
Puntos: 6
Re: Aprendiendo POO me he topado con un error con public ¬¬

Código PHP:
    public $variableA
Fijate que has olvidado el ;, en el resto del fichero te paso lo mismo. Por otro lado... atributos publicos ... mejor atributos privados y sus correspondientes metodos get, set.

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #3 (permalink)  
Antiguo 08/03/2007, 07:33
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public ¬¬

xD OMG ya me vale... Gracias tio... ( esto me pasa por copiar el codigo que yo mismo escribí lol... xD )... aishhhh

Gracias por el aviso de los privates ;) lo sé... pero para el ejemplo lo he obviado... como decia una cancion... "ya habrá tiempo para florituras"

Muchas gracias...
  #4 (permalink)  
Antiguo 08/03/2007, 07:47
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public ¬¬

Pongo el ejemplo completo y terminado de herencia encadenada comprobado [Funciona] ;)

Código PHP:
<?php
class {
    
// Atributos
    
private $variableA;
    
    
// Metodos
    
public function setVariableA($variableA) {
        
$this->variableA $variableA;
    }
    public function 
getVariableA() {
        return 
$this->variableA;
    }
}
class 
extends {
    
// Atributos
    
private $variableB;
    
    
// Metodos
    
public function setVariableB($variableB) {
        
$this->variableB $variableB;
    }
    public function 
getVariableB() {
        return 
$this->variableB;
    }
}
class 
extends {
    
// Atributos
    
private $variableC;
    
    
// Metodos
    
public function setVariableC($variableC) {
        
$this->variableC $variableC;
    }
    public function 
getVariableC() {
        return 
$this->variableC;
    }
}

// Llamamos a los objetos miembros de la clase A
    
    
$objA = new A();
    
$objA->setVariableA("Esta es la variable A.<br />");
    echo 
$objA->getVariableA();
    echo 
"-------------------------------------------<br />";
    
    
// Llamamos a los objetos miembros de la clase B
    
    
$objB = new B();
    
$objB->setVariableA("Esta es la variable A.<br />");
    
$objB->setVariableB("Esta es la variable B.<br />");
    echo 
$objB->getVariableA();
    echo 
$objB->getVariableB();
    echo 
"-------------------------------------------<br />";
    
// Llamamos a los objetos miembros de la clase C
    
    
$objC = new C();
    
$objC->setVariableA("Esta es la variable A.<br />");
    
$objC->setVariableB("Esta es la variable B.<br />");
    
$objC->setVariableC("Esta es la variable C.<br />");
    echo 
$objC->getVariableA();
    echo 
$objC->getVariableB();
    echo 
$objC->getVariableC();
    
    
?>
Gracias
  #5 (permalink)  
Antiguo 08/03/2007, 07:51
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 8 meses
Puntos: 6
Re: Aprendiendo POO me he topado con un error con public ¬¬

No se trata de "florituras", se trata de hacer las cosas bien :P. Ademas, si ya estas utilizando metodos tipo set/get no veo por que te estás tardando en pasar esos atributos a privados jeje. Y yo tambien estoy aprendiendo
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #6 (permalink)  
Antiguo 08/03/2007, 08:08
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public ¬¬

Por que xD como decía, prefiero asimilar bien primero el concepto de herencia simple y/o encadenada... Además soy duro de moyera xDD jajaja... pero sí, proximamente me dedicaré a hacerlo con funciones __set y __get y toda la retahíla de funciones MAGICASSSS jejeje.... ok ok, me lo apunto ;) Pero poquito a poco... buena letra y sin rayadas xD ke sino uno se sobrecarga jejeje
  #7 (permalink)  
Antiguo 08/03/2007, 19:51
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 9 meses
Puntos: 32
Re: Aprendiendo POO me he topado con un error con public ¬¬

Mmmm.... (me estoy cansando de repetirlo)... es un tema conceptual. Los atributos públicos *están prohibidos* en la POO y es el primer error grave que cometen los novatos.

Si dejas los atributos públicos significa que no entiendes el significado de "encapsulación", lo cual es otro fallo de desconocimiento en los principios de la POO.

Y si no te preocupas por los conceptos base, no tienen sentido aprender solo sintaxis, otro gran problema de la mayoría de los libros sobre OO y PHP.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 08/03/2007, 19:55
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 9 meses
Puntos: 32
Re: Aprendiendo POO me he topado con un error con public ¬¬

No sé quién es el autor, pero no tiene sentido el término de "herencia encadenada". Generalmente se habla de herencia simple o múltiple, pero lo que describe como "encadenada" es una jerarquía completamente habitual al usar "generalización" o "especialización" de clases.

Es decir, si usas herencia en más de un nivel (que no tiene nada de extraño) estarías haciendo lo que dice como "encadenada" y ponerle nombre a algo tan elemental no le veo sentido.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #9 (permalink)  
Antiguo 09/03/2007, 01:22
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public ¬¬

Hola enriqueplace,

Gracias por el aporte, seguro me será muy util. Comparto lo que dices tanto en que 'es un tema conceptual' en que los atributos publicos *están prohibidos*. Te agradezco la alusión al concepto de encapsulación, leeré sobre ello.

Bueno, hay una cosa que discrepo un poco... jeje
Cita:
Y si no te preocupas por los conceptos base, no tienen sentido aprender solo sintaxis, otro gran problema de la mayoría de los libros sobre OO y PHP.
Hace pocos dias que me compré el libro, creo que los errores son comprensibles todavía. Lo primero que hice fue ir al capitulo 'Programación orientada a objetos' y leermelo entero, con el fin de entender sus principios, no el de la sintaxis... Pero sé que estos conceptos me llevará un tiempo asimilarlos e interiorizarlos.



Mmmm... en el libro pone que el autor es "Luis Miguel Cabezas Granado"... Además pone "Prólogo de Zeev suraski y Andi Gutmans" nombres que particularmente yo no conozco, pero no me importa, el libro lo cojí por que me parecía bueno para aprender, ya que tiene una presentación muy limpia, clara y eso lo hace agradable de leer y funcional. Hay que tener claro que es un libro de aprendizaje y a nivel de bajo a medio, el libro no buscará profundizar ni se especializará, pero enseñar php de una buena manera a nivel medio lo creo con creces.

En cuanto a lo de la 'herencia encadenada', bueno si, es simplemente un termino... mejor o peor usado, me refería a lo que tu has preferido llamar (seguro de una forma mas correcta) nivel de herencia, sin especificar un nombre... Para mi lo de 'herencia encadenada' era unicamente un recurso que me ayudaba a comprender una de las formas en la que el codigo puede ser extendido.

Por ultimo, he leido un post tuyo en tu blog de 'PHPSenior' sobre la herencia... que creo que releeré unas cuantas veces a lo largo del tiempo. jeje

Gracias por la respuesta ;)
  #10 (permalink)  
Antiguo 09/03/2007, 04:51
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 9 meses
Puntos: 32
Re: Aprendiendo POO me he topado con un error con public ¬¬

Cita:
Hace pocos dias que me compré el libro, creo que los errores son comprensibles todavía. Lo primero que hice fue ir al capitulo 'Programación orientada a objetos' y leermelo entero, con el fin de entender sus principios, no el de la sintaxis... Pero sé que estos conceptos me llevará un tiempo asimilarlos e interiorizarlos.
Lo que quiero transmitirte con el tema de los libros es que la mayoría se basan en presentarte la sintaxis de PHP5, recorrer todas sus funciones, de arriba a abajo. En mi opinión, si un libro de PHP5 tiene un solo capítulo sobre objetos, ya está mal enfocado y estás perdiendo todo el poder de la nueva versión.

El punto es: la herramienta no es lo importante en sí, lo importante es qué puedes hacer con ella.

Cita:
y eso lo hace agradable de leer y funcional. Hay que tener claro que es un libro de aprendizaje y a nivel de bajo a medio, el libro no buscará profundizar ni se especializará, pero enseñar php de una buena manera a nivel medio lo creo con creces.
Ten cuidado, la mayoría de los programadores solo sabe de sintaxis y desconoce de objetos por la óptica de estos libros. Hay una gran diferencia entre "programador" (pensamiento orientado al lenguaje/sintaxis) y "desarrollador" (orientado a los sistemas).

Cita:
En cuanto a lo de la 'herencia encadenada', bueno si, es simplemente un termino... mejor o peor usado, me refería a lo que tu has preferido llamar (seguro de una forma mas correcta) nivel de herencia, sin especificar un nombre... Para mi lo de 'herencia encadenada' era unicamente un recurso que me ayudaba a comprender una de las formas en la que el codigo puede ser extendido.
Esa es la parte que no entiendo, lo que describen como "encadenada" es simplemente el funcionamiento normal de la herencia, lo que dan a entender que hubiera algo distinto, y no es cierto. Eso es herencia y punto.

Cita:
Por ultimo, he leido un post tuyo en tu blog de 'PHPSenior' sobre la herencia... que creo que releeré unas cuantas veces a lo largo del tiempo. jeje
Tampoco es tan difícil. Siempre digo que muchas de las cosas que escribo son muy habituales y sumamente básicas en el ambiente Java, lo cual nos dice que nosotros estamos muy en las penumbras con PHP.

Y uno de los grandes problemas son por pensar solo en el lenguaje y no en la arquitectura como un todo.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #11 (permalink)  
Antiguo 09/03/2007, 07:31
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public ¬¬

Sí, creo que la reflexión me parece correcta.

A mi me preocupa también lo que dices, sé o creo saber, claro lo que sale en el capitulo de este libro, es una aproximación, descriptiva y breve de los principios de POO y un ejemplo breve... Presupongo hay mucho mas, y me importa mas aprender a programar, que aprender php...

Ahora estaba leyendo unas cosas nuevas para mi y por lo poco que he leido algo complejas tambien... son los 'patrones de diseño' en concreto he mirado el singleton, que casualidades de la vida, me he vuelto a topar con un post tuyo de PHPSenior en las tipicas busquedas por google y la wiki xD... y bueno lo he entendido el singleton bien bien... he visto que hay diferentes tipos de patrones ( para creación, estructurales, de comportamiento... ) aunque por ahora paso de discutir sobre esto... pues no sabria bien como o cuando deberia implementarlos... me hago una idea... pero realmente creo necesitaría bastante mas practica y experiencia.

Mmmmmmm.... Hubo un tiempo en el que yo... solo pensaba en aprender php.... ejem.... bueno me aprendí toda la sintaxis si xDDD jaja... despues vi, me di cuenta, que con eso... bueno si, yo sabia con que cosas podia hacer otras cosas... pero que en realidad no sabia utilizarlas si no era mas que para un pequeño script... esto me frustraba. Entonces poco a poco he ido haciendo timidos acercamientos a POO, y este ultimo es un poquito mas fuerte y mas decidido jeje y con bastante precaucion.

Iré estudiando los principios de la POO...
La verdad es que desde que he aprendido lo de la herencia y como poder reutilizar el codigo,... desarrollar webs me parece algo mas facil :)

Saludos
  #12 (permalink)  
Antiguo 09/03/2007, 08:17
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 9 meses
Puntos: 32
Re: Aprendiendo POO me he topado con un error con public ¬¬

Última sugerencia, para que veas que "herencia" no es algo que debe usarse a diestra y siniestra, lee el "Principio de Liskov".
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #13 (permalink)  
Antiguo 09/03/2007, 13:39
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: Aprendiendo POO me he topado con un error con public

Principios de POO
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #14 (permalink)  
Antiguo 14/03/2007, 06:32
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public

Bueno asi a tontas y a lokas xD (por ke para ser sinceros, no me lo he mirado mucho) creo haber entendido ke el "Principio de Liskov" explica entre otras cosas supongo o con matices... que a medida que vas haciendo herencias y se va prolongando la cosa... es mas facil ke surjan los errores si no se ha echo to de una forma digamos "correcta"... conceptos de especifidad y todo eso todavía son munnncho pa mi xDDD jejeje

De todas formas ^_^ Muchas gracias por la información. Me gustaría poder amueblar en mi cabecita loka, ideas generales para poder aclararme sobre lo ke son y/o como se usan, cuales son etc... arquitecturas, patrones de diseño, conceptos poo, aprender a implementar... Creo que es el buen camino, aunque no precisamente por ese orden :S Cualquier aporte o indicación a nivel asesor xD me será útil

B** Muchas gracias xD, no conocia la pagina y parece estar bien explicado... Además tenía ganas de volver a mirarme los conceptos de poo ahora jiji... me viene de perlas ;)
  #15 (permalink)  
Antiguo 14/03/2007, 07:04
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 9 meses
Puntos: 32
Re: Aprendiendo POO me he topado con un error con public

Cita:
Iniciado por yoguuu Ver Mensaje
Bueno asi a tontas y a lokas xD (por ke para ser sinceros, no me
Bueno, pero luego no te quejes si no entiendes o no te responden... primero lee los libros, y luego pregunta, no al revés. A mi también me da "modorra" contestar una y otra vez las mismas preguntas de conceptos cuando hay mucho material para leer.

Cita:
Iniciado por yoguuu Ver Mensaje
lo he mirado mucho) creo haber entendido ke el "Principio de Liskov" explica entre otras cosas supongo o con matices... que a medida que vas haciendo herencias y se va prolongando la cosa... es mas facil ke surjan los errores si no se ha echo to de una forma digamos "correcta"... conceptos de especifidad y todo eso todavía son munnncho pa mi xDDD jejeje
A grandes rasgos dice que el famoso "es un" (is_a) que generalmente usan los docentes para enseñarnos "herencia" no es suficiente. No basta con "ser" hay que "comportarse como tal".

Generalmente hago el mismo chiste cuando trato el tema en un curso: "un docente es una persona, pero no basta, debe comportarse como tal". Otro ejemplo más real: tienes un sistema que liquida sueldos, una clase base "Empleado" y subclases Gerente, Desarrollador, Administrativa y Becario (asumamos que el último no cobra sueldo).

Usas polimorfismo y recibe el método "liquidarSueldo" objetos de tipo Empleado. Bien, cuando en un momento recibes de tu lista de empleados un becario, que debe hacer el sistema?
  1. ¿Emitir un comprobante impreso pero con valor 0?
  2. ¿Agregar un "if" preguntando si es becario, y no hacer nada?
  3. etc

Supongamos que el 1) no es aceptable por el gasto de papel y te piden que no se impriman (no tiene sentido), pasamos al punto 2), agregamos un "if".

¿No estamos "codificando a fuego" nuestro sistema para un comportamiento particular? rompiendo el polimorfismo, justamente, el patrón estratégico más importante que tiene la POO. Cada vez que tenemos que cambiar nuestro código generamos nuevos costos y nuevos posibles errores.

Por eso cada vez nos cuesta más desarrollar un sistema, hasta que tenemos que tirarlo y desarrollar otro de cero... y empezamos otra vez con los problemas del mal diseño.

Los principios de diseño te dicen que "desarrolla cerrado al cambio y abierto a la extensión" (Principio Open/Closed, "Abierto / Cerrado"). Por ejemplo, tu código debe ser reutilizable (¿no es la idea de la OO?) y con solo agregar código sin tocar el existente lograrás ir adecuarte a los cambios, a los nuevos requerimientos. No te olvides que nuestro código lo usan muchos otros objetos, si este cambiara, generaría un efecto en cadena, posiblemente, dejando de funcionar lo ya existente y tener que modificar más objetos.

Esta forma de "extensión" es agregar más clases a la herencia y el método "liquidarSueldo" no se modifica, pero si tu no haces correctas herencias, no puedes hacer lo primero, por lo tanto tu sistema se degradará en cascada.

Esta simple tontería el autor demuestra con muchos ejemplos que hacer "herencia por herencia", "por reutilizar código", no es suficiente y genera grandes problemas en los diseños.

Es una de las razones que me ven de mal humor cuando veo que implementan herencia a los golpes, prueba y error, con el argumento solo de "reutilizar código"
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 14/03/2007 a las 10:06
  #16 (permalink)  
Antiguo 14/03/2007, 13:22
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 2 meses
Puntos: 2
Re: Aprendiendo POO me he topado con un error con public

Gracias Enriqueplace. Me sirve de mucho lo que me vas contando. Por que precisamente lo que mas me confunde a la hora de ponerme a hacer algo... es si esa es la forma correcta de hacerlo; - "no me podrás negar, que complejo si viene siendo..."

Creo que ahora lo que necesito es darme a mi mismo un poco de tiempo, para leer, asimilar e interiorizar los conceptos... a base de leer y probar.

De nuevo gracias ;)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:11.