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

Sobrescribir una función que se encuentra dentro de una clase

Estas en el tema de Sobrescribir una función que se encuentra dentro de una clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hace rato un cliente me pasó unos archivos desarrollados por una Eminencia en Programación. - No le puedo tocar ni un pelo al código porque ...
  #1 (permalink)  
Antiguo 09/07/2016, 09:32
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 6 meses
Puntos: 832
Sobrescribir una función que se encuentra dentro de una clase

Hace rato un cliente me pasó unos archivos desarrollados por una Eminencia en Programación.

- No le puedo tocar ni un pelo al código porque -según el cliente- la Eminencia dejó esa instrucción antes de irse de vacaciones, y podría enojarse si le desobedecen (dicen que lanza objetos y todo).

- Estoy a punto de mandar al cliente y su Eminencia al carajo, pero primero me gustaría que alguien tuviera la amabilidad de aclararme la duda.

- Hay una clase en especial que funciona, pero una de sus funciones tiene un par de errores evidentes ( por cierto, uno de ellos es el uso de split() ) que quisiera corregir sin tocar el código. Supongamos que tenemos esto:

Código PHP:
Ver original
  1. class Foo {
  2.     function myFoo() {
  3.         $cod = 'Código malo';
  4.         return $cod;
  5.     }
  6.  
  7.     function Baz() {
  8.         $cod = 'Código bueno';
  9.         return $cod;
  10.     }
  11. }
  12.  
  13. $foo = new Foo;
  14.  
  15. echo( $foo->myFoo() );

Quisiera hacer algo así...

Código PHP:
Ver original
  1. class Bar extends Foo {
  2.     function myFoo() {
  3.         $cod = 'Código arreglado';
  4.         return $cod;
  5.     }
  6. }
... pero con el detalle de que se siga usando $foo->myFoo(), porque la clase está dispersa por todo el sistema de archivos ¿Cómo se le hace amigos, o es imposible?
  #2 (permalink)  
Antiguo 11/07/2016, 08:25
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Sobrescribir una función que se encuentra dentro de una clase

En el caso que mencionas puedes usar polimorfismo mediante herencia, ejemplo
Código PHP:
Ver original
  1. class Foo {
  2.     function myFoo() {
  3.         $cod = 'Código malo';
  4.         return $cod;
  5.     }
  6.  
  7.     function Baz() {
  8.         $cod = 'Código bueno';
  9.         return $cod;
  10.     }
  11. }
  12.  
  13. class CustomFoo extends Foo {
  14.  
  15.     public function myFoo()
  16.     {
  17.         $badCode = parent::myFoo();
  18.         return $this->fix($badCode);
  19.     }
  20.    
  21.     public function fix($code)
  22.     {
  23.         return str_replace('malo','bueno', $code);
  24.     }
  25.    
  26.  
  27. }
  28.  
  29. class Bar {
  30.    
  31.     private $foo;
  32.  
  33.     public function __construct(Foo $foo)
  34.     {
  35.         $this->foo = $foo;
  36.     }
  37.    
  38.     public function myFoo()
  39.     {
  40.         return $this->foo->myFoo();
  41.     }
  42. }
  43.  
  44.  
  45. $foo = new CustomFoo;
  46.  
  47. echo( $foo->myFoo() );
  48.  
  49. //Test in class Bar
  50.  
  51. $bar = new Bar($foo);
  52. echo $bar->myFoo();
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 12/07/2016, 04:53
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 6 meses
Puntos: 832
Respuesta: Sobrescribir una función que se encuentra dentro de una clase

Gracias por respnder hhs.
  #4 (permalink)  
Antiguo 07/10/2016, 09:29
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 13 años, 4 meses
Puntos: 8
Respuesta: Sobrescribir una función que se encuentra dentro de una clase

Para llamar una función dentro de otra debe declarar como abstracta a no ser utilice una interface con dos métodos .

En su caso metacortex puede utilizar una interface para sus dos funciones es la manera correcta.

Le dejo el enlace: http://php.net/manual/es/language.oop5.interfaces.php

un ejemplo:


Código PHP:
Ver original
  1. <?php
  2. class MyClass
  3. {
  4.     protected function myFunc() {
  5.  
  6. function call($variable){
  7.  
  8.  return $variable;
  9.  
  10. }
  11.  
  12.  
  13.     }
  14. }
  15.  
  16. class OtherClass extends MyClass
  17. {
  18.     // Sobrescritura de definición parent
  19.     public function myFunc()
  20.     {
  21.         // Pero todavía se puede llamar a la función parent
  22.         parent::myFunc();
  23.         echo call($variable='valor');
  24.     }
  25. }
  26.  
  27. $class = new OtherClass();
  28. $class->myFunc();
  29. ?>

Última edición por skywolker; 13/10/2016 a las 23:07

Etiquetas: clase, encuentra
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 04:55.