Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Duda con funcionamiento y organización de Traits

Estas en el tema de Duda con funcionamiento y organización de Traits en el foro de PHP en Foros del Web. Leyendo el manual de PHP con sus ejemplos, no me ha quedado claro lo siguiente: ¿Para que dos clases de PHP puedan compartir métodos y ...
  #1 (permalink)  
Antiguo 02/05/2014, 13:36
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Duda con funcionamiento y organización de Traits

Leyendo el manual de PHP con sus ejemplos, no me ha quedado claro lo siguiente:

¿Para que dos clases de PHP puedan compartir métodos y atributos mediante Traits deben "use" el mismo Trait?

Respecto a la organización de los Traits en el sistema de archivos y carpetas:

¿Dónde es mejor alojar los Traits, en un documento a parte de las clases, en el mismo documento de las clases, en el documento de la clase que más utilice Traits?

Estoy haciendo desde cero un sistema captcha y decidí hacerlo pero utilizando Traits y de ahí estas dudas.

Saludos! :)
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 02/05/2014, 16:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
¿Para que dos clases de PHP puedan compartir métodos y atributos mediante Traits deben "use" el mismo Trait?
Los traits te permiten reutilizar piezas de código fácilmente.

Cita:
¿Dónde es mejor alojar los Traits, en un documento a parte de las clases, en el mismo documento de las clases, en el documento de la clase que más utilice Traits?
Deberían ubicarse de manera que esto pueda llevarse a cabo sin afectar código adicional.

Es decir, al igual que las clases deben estar en su propio archivo, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 02/05/2014, 16:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Duda con funcionamiento y organización de Traits

Concuerdo deben estar solitos en sus propios archivos porque justamente son reutilizables por varias clases y es el criterio para las primeras.

Se pueden usar Namespace para unificar logicamente con las clases relacionadas.
__________________
Salu2!
  #4 (permalink)  
Antiguo 03/05/2014, 02:47
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

Muchas gracias a ambos. Solo hay una cosa, respecto a mi primera pregunta no me quedó clara la respuesta.

Estoy probando lo siguiente en cuatro archivos en el mismo directorio:

clase A (archivo ca.php)
Código PHP:
Ver original
  1. class A{
  2.     public function methodA(){
  3.         echo "A";
  4.     }
  5. }

trait B (archivo trait.php)
Código PHP:
Ver original
  1. require_once 'ca.php';
  2.  
  3. trait B{
  4.     public function methodA(){}
  5. }

clase C (archivo cc.php)
Código PHP:
Ver original
  1. require_once 'trait.php';
  2.  
  3. class C{
  4.     use B;
  5. }

archivo action.php (simplemente para instanciar la clase C)

Código PHP:
Ver original
  1. require_once 'cc.php';
  2.  
  3. $o=new C();
  4. $o->methodA();

Y no imprime "A".

En cambio si coloco todo en el mismo archivo

Código PHP:
Ver original
  1. class A{
  2.     public function methodA(){
  3.         echo "A";
  4.     }
  5. }
  6.  
  7. trait B{
  8.     public function methodA(){}
  9. }
  10.  
  11. class C{
  12.     use B;
  13. }
  14.  
  15. $o=new C();
  16. $o->methodA();

Sí imprime "A"

¿Por qué sucede esto?

En los ejemplos del manual lo explican como si todo fuera en el mismo archivo, pero ¿cómo utilizar los traits cuando los ubicamos en archivos distintos?

Un saludo! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 03/05/2014, 04:59
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

Me equivoqué en mi último post. No imprime "A" aunque todo esté en el mismo documento, no me fijé que C "extends" A, entonces metí la pata.

Entendiendo esto ¿quiere decir que a la hora de programar orientado a objetos los Traits son clases que no se pueden instanciar como las abstractas y que tienen código funcional para ser "use" por otras clases?

Entonces entendí los Traits al revés, creía que los Traits eran como las interfaces pero que permitían usar los métodos entre todas las clases que "use" el mismo Trait.

Por favor, que alguien me lo aclare.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 03/05/2014, 07:27
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Duda con funcionamiento y organización de Traits

Pues a mi con PHP 5.4.26 no me imprime nada ni todo junto y con error_reporting(-1) no me da ningun error. Probe otro ejemplo del manual y si funciono.


A estos Traits no les veo mucho futuro...... no me convence usar herencia multiple en estos tiempos de composicion

Encontre un articulo interesante que deberias leer @guardarmicorreo
__________________
Salu2!

Última edición por Italico76; 03/05/2014 a las 07:46
  #7 (permalink)  
Antiguo 03/05/2014, 08:08
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

Bueno, supongamos que los Traits solo sirven para generar code-smell :D

Y entonces ¿cómo resolver la herencia múltiple? No veo que proponga nada, simplemente criticar que se abusan de los Traits porque no se sabe programar.
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 03/05/2014, 08:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
Iniciado por Italico76 Ver Mensaje
A estos Traits no les veo mucho futuro...... no me convence usar herencia multiple en estos tiempos de composicion
El tema es que existen alternativas en la composicion de objetos...... y con muchas ventajas como menor acoplamiento y dinamicas

PHP va en contra de la corriente, montado en una ola pequeñita, la lo de los "mixin" que propone Ruby pero la tendencia hace tiempo es no mas herencia multiple primero porque genera muchos conflictos (que deben resolverse en tiempo de compilacion) y segundo porque ya existen patrones de diseño que resuelven esa necesidad.


Es posible el PHP Group este un poco temeroso de la fuerza que esta cojiendo Python o de un resurgimiento de Ruby, ambos ricos en caracteristicas y con algun tipo herencia multiple pero los mixin no son algo que la comunidad estuviera pidiendo a gritos.
__________________
Salu2!
  #9 (permalink)  
Antiguo 06/05/2014, 18:56
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Duda con funcionamiento y organización de Traits

Que tema tan interesante. se que llego tarde pero es para agregar comentarios adicionales
Cita:
Iniciado por guardarmicorreo Ver Mensaje
Entendiendo esto ¿quiere decir que a la hora de programar orientado a objetos los Traits son clases que no se pueden instanciar como las abstractas y que tienen código funcional para ser "use" por otras clases?

Entonces entendí los Traits al revés, creía que los Traits eran como las interfaces pero que permitían usar los métodos entre todas las clases que "use" el mismo Trait.

Por favor, que alguien me lo aclare.
Se parecen pero son conceptos completamente diferentes, lo que tienen en común es que promueven la reutilización de código:
  • Las clases abstractas son interfaces para sus clases hijas y promueven la reutilización de código mediante la herencia y polimorfismo.
  • Las interfaces al separar el comportamiento de la implementación promueven la reutilización mediante polimorfismo.
  • Los traits refactorizan el comportamiento sacándolo de la clase, así que promueven la reutilización como unidades primitivas de funcionalidad que pueden utilizar otra clases.
Generalmente se usan las interfaces para proveer funcionalidad entre clases que no tiene una relación, pero no es para lo que se hicieron las interfaces aun que el lenguaje permite usarlas de esa forma.

Cita:
Iniciado por Italico76 Ver Mensaje

A estos Traits no les veo mucho futuro...... no me convence usar herencia multiple en estos tiempos de composicion
Precisamente un objeto puede ser visto como la composición de unidades mas pequeñas de comportamiento, de tal forma que pueden ser reutilizables. Esta es la idea detrás de los traits y no implica la herencia múltiple. El detalle es que en php esto parece tener tintes de herencia múltiple por la forma en la que esta implementado y es que también pueden ser usados como mixin . Pero si los usas con el concepto que deben de tener no veo mayor problema

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Bueno, supongamos que los Traits solo sirven para generar code-smell :D

Y entonces ¿cómo resolver la herencia múltiple? No veo que proponga nada, simplemente criticar que se abusan de los Traits porque no se sabe programar.
Así es hasta cierto punto el articulo mas bien parece un resistencia al cambio. La realidad es que en muchos panoramas no la necesitas, Solo en caso que no tienes control para tener un intermediario que implemente las funcionalidad que necesitas y la composición no te sirve.
y si llegas a ese punto tal vez el trait se lo tuyo.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #10 (permalink)  
Antiguo 07/05/2014, 07:58
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
Iniciado por Italico76 Ver Mensaje
El tema es que existen alternativas en la composicion de objetos...... y con muchas ventajas como menor acoplamiento y dinamicas
No es lo mismo.No estoy muy seguro de que las personas que manejan esta argumentación, hayan usado mucho la herencia multiple en c++, y luego hayan pasado , por ejemplo, a Java.

Hay muchos argumentos, pero sólo voy a dar uno:El argumento de la composición de objetos es igualmente aplicable a la herencia simple.Si eliminas cualquier tipo de herencia, seguirás teniendo composición.
Si hay algún tipo de ventaja en la herencia, la hay en la herencia múltiple.Si no la hay en la múltiple, no la hay en ninguna.

Por cierto, yo entiendo que los lenguajes quieran evolucionar y tal, y que haya competitividad entre los lenguajes a ver quién añade nosequé cosa nueva...personalmente, lo veo todo como puro marketing.Y no creo que los programadores , o los sistemas hechos con esos lenguajes, sean los beneficiados. En este punto, es interesante ver cómo lenguajes como javascript, con muuuy poquita evolución a lo largo de los años, ha encontrado nuevos paradigmas de programación sin llenar de "features" el lenguaje.
  #11 (permalink)  
Antiguo 07/05/2014, 10:30
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

:) creía que me había quedado claro, pero veo que no.

Italico76 dijo que los Traits se pueden evitar desacoplando en mayor medida las clases, cosa que creo que es discutible y que no tienen mucho que ver una cosa con la otra.

Pero en general entendí que los Traits, por muy útiles que sean, no están contemplados en el futuro de la mayoría de lenguajes porque es algo que lleva a crear código dañino a la vista (como el mío :D ).

Pero ahora llegais hhs y dashtrash y le dais un nuevo enfoque. Fascinante :D

vamos a ver si me entero sobre código

Esto sería la herencia simple en PHP
Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class A {
  4.  
  5.     public static function saymethodsA() {
  6.         return get_class_methods('A');
  7.     }
  8.  
  9. }
  10.  
  11. class B extends A {
  12.  
  13.     public function printmethods() {
  14.         ?>
  15.         <pre>
  16.         <?php
  17.         var_dump(parent::saymethodsA());
  18.     }
  19.  
  20. }
  21.  
  22. B::printmethods();
  23. /*
  24.  * imprime
  25.  *
  26.    array(1) {
  27.     [0]=>
  28.     string(11) "saymethodsA"
  29.    }
  30.  *
  31.  */

Esto es el uso de Traits para simular la herencia múltiple solucionando ciertos problemas que conlleva la herencia múltiple como tal.
Código PHP:
Ver original
  1. abstract class E {
  2.  
  3.     public static function saymethodsE() {
  4.         return get_class_methods('C');
  5.     }
  6.  
  7. }
  8.  
  9. Trait coreEF{
  10.     public static function saymethods($class){
  11.         return get_class_methods($class);
  12.     }
  13. }
  14.  
  15. class F{
  16.     use coreEF;
  17. }
  18.  
  19. ?>
  20. <pre>
  21. <?php
  22. var_dump(F::saymethods('A'), F::saymethods('B'), F::saymethods('E'), F::saymethods('F'));
  23.  
  24. /*
  25.  * imprime
  26.  */
  27. //array(1) {
  28. //  [0]=>
  29. //  string(11) "saymethodsA"
  30. //}
  31. //array(2) {
  32. //  [0]=>
  33. //  string(12) "printmethods"
  34. //  [1]=>
  35. //  string(11) "saymethodsA"
  36. //}
  37. //array(1) {
  38. //  [0]=>
  39. //  string(11) "saymethodsE"
  40. //}
  41. //array(1) {
  42. //  [0]=>
  43. //  string(10) "saymethods"
  44. //}

¿Cómo se podría resolver el problema de los Traits desacoplando las clases unas de otras?

(Entiendo desacoplar como la estrategia de componer/construir/escribir clases de manera que unas dependan de las otras lo menos posible)

A mi solo se me ocurren dos posibilidades y no estoy seguro de la segunda:

1) metiendo en clases funcionalidades que no guardan relación entre si, por lo tanto se estaría rompiendo lo que es el concepto de POO.

2) utilizando los namespaces de manera tal que dentro de las propias clases se utilicen otras clases.

EDITO:

hhs no me confundas más!! jaja que me costó mucho entender la gran enorme diferencia entre interfaz (algo raro que no entiendo su utilidad relevante) y el resto de código ejecutable y útil, como clases y traits :D
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 07/05/2014 a las 10:38
  #12 (permalink)  
Antiguo 08/05/2014, 07:08
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
Iniciado por guardarmicorreo Ver Mensaje

¿Cómo se podría resolver el problema de los Traits desacoplando las clases unas de otras?
Y por qué querrías desacoplarlas? Como para mí los traits son herencia múltiple disfrazada, eso es equivalente a preguntarse cómo desacoplar una clase de su clase base.No quieres hacer eso.

Considero un sistema acoplado cuando existen dependencias entre clases, y no son completamente necesarias.
Ejemplo: una clase A que gestiona pedidos, que usa una clase B para enviar emails.Para gestionar un pedido, no es absolutamente necesario enviar un email. A su vez, mañana podríamos necesitar que, además de enviar un email, envíe un SMS o quién sabe qué.Lo que quieres es que la clase que sea, haga su trabajo, y exclusivamente su trabajo (aunque a nivel de negocio, la creacion de un pedido implique que se envie un email, a nivel de responsabilidad de código, la clase Pedido no debería enviar ningún email).
La programación orientada a eventos es una solución sencilla.Cuando un pedido se crea, lanza un evento de "Pedido creado", y alguien que está subscrito a ese evento, lanza un email.Pero las clases Pedido y Email no se conocen entre sí.
A eso es a lo que yo llamo un código desacoplado.
Si A hereda de B, A *es* un B.No tiene demasiado sentido desacoplar algo de sí mismo.

Por cierto, traits no son exactamente mixins.Los traits se especifican en tiempo de "compilacion".Un "mixin" puede crearse en tiempo de ejecución (véase javascript).
  #13 (permalink)  
Antiguo 10/05/2014, 13:44
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
¿Cómo se podría resolver el problema de los Traits desacoplando las clases unas de otras?

(Entiendo desacoplar como la estrategia de componer/construir/escribir clases de manera que unas dependan de las otras lo menos posible)
Un Trait no pretende desacoplar las clases, ese es un tema que se resuelve de otras formas. El trait te sirve para reutilizar comportamiento colocándolo en otro sitio y que lo puedas utilizar en otras clases.
Una forma vulgar de verlos, seria como un copy paste de los métodos que hacen lo mismo y están distribuidos en diferentes clases.

Cita:
hhs no me confundas más!! jaja que me costó mucho entender la gran enorme diferencia entre interfaz (algo raro que no entiendo su utilidad relevante) y el resto de código ejecutable y útil, como clases y traits :D
Los conceptos relacionados con la POO son a veces confusos por que hay una tendencia a pensar mas en las clases que en los objetos y hay que recordar que construimos sistemas orientados a objetos no a clases.

Para finalizar espero haber aclarado un poco el panorama y espero que pruebes por ti mismo si tiene alguna utilidad para ti.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #14 (permalink)  
Antiguo 11/05/2014, 02:04
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

Muchas gracias a ambos, dashtrash y hhs. Me pondré a trabajar sobre el código para poder ver todo lo que me habéis dicho y tratar de sacar alguna conclusión en claro.

Un saludo! :)
__________________
Ayúdame a hacerlo por mi mismo.
  #15 (permalink)  
Antiguo 11/05/2014, 08:45
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Duda con funcionamiento y organización de Traits

Cita:
Iniciado por guardarmicorreo Ver Mensaje
:)
Italico76 dijo que los Traits se pueden evitar desacoplando en mayor medida las clases, cosa que creo que es discutible y que no tienen mucho que ver una cosa con la otra.
Ojo que nunca dije tal cosa! todo lo contrario, el uso de Traits puede generar mayores dependencias que usar objetos en Composicion

Yo usaria Traits solo cuando quiero reutilizar codigo, no sea aplicable la herencia (clases poco relacionadas) pero siempre va a ser mas rigido que usar objetos porque las dependencias en el caso de los Traits son tratadas en "tiempo de compilacion" mientras que si usas "objetos" (no clases) en composición es en "runtieme"
__________________
Salu2!

Etiquetas: funcionamiento
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 09:39.