Foros del Web » Programando para Internet » PHP »

PHP OO Función previa a ejecutar una función estática

Estas en el tema de Función previa a ejecutar una función estática en el foro de PHP en Foros del Web. Buenas tardes, Tengo una clase muy grande la cual está llena de funciones estáticas. Pues bien, yo quiero extender esta clase y aplicar un try ...
  #1 (permalink)  
Antiguo 24/06/2015, 07:13
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Pregunta Función previa a ejecutar una función estática

Buenas tardes,

Tengo una clase muy grande la cual está llena de funciones estáticas. Pues bien, yo quiero extender esta clase y aplicar un try catch a la llamada de cada función estática, pero intentando evitar el tener que reescribir cada método, aunque sea utilizando super.

¿Existe alguna forma de hacer esto?


Gracias!
__________________
Neversyn Software e Ingeniería
  #2 (permalink)  
Antiguo 24/06/2015, 08:59
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Función previa a ejecutar una función estática

class b extended A{
public static method{
try{
self::method();
}catch{}
}
}
  #3 (permalink)  
Antiguo 24/06/2015, 09:02
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Función previa a ejecutar una función estática

Hola Patriarka, gracias por responder. Entiendo la idea, pero eso me obligaría a hacerlo por cada método al que quiera aplicar eso... Yo quiero saber si hay algún método mágico o similar que se llame automáticamente al llamar a un método estático que aplique eso.

Gracias!!
__________________
Neversyn Software e Ingeniería
  #4 (permalink)  
Antiguo 24/06/2015, 09:25
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: Función previa a ejecutar una función estática

Cual es la razón para extender la clase ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 24/06/2015, 09:36
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Función previa a ejecutar una función estática

class b extended A{
public static generic_method($method=''){
try{
self::{$method}();
}catch{}
}
}
  #6 (permalink)  
Antiguo 24/06/2015, 09:37
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Función previa a ejecutar una función estática

Cita:
Iniciado por zeuslife Ver Mensaje
Hola Patriarka, gracias por responder. Entiendo la idea, pero eso me obligaría a hacerlo por cada método al que quiera aplicar eso... Yo quiero saber si hay algún método mágico o similar que se llame automáticamente al llamar a un método estático que aplique eso.

Gracias!!
Que yo sepa lo tienes que hacer con todos. No existe nada como lo que dices.

EDITO:
Cita:
Iniciado por Patriarka Ver Mensaje
class b extended A{
public static generic_method($method=''){
try{
self::{$method}();
}catch{}
}
}

No lo conocía. Muy útil :D
  #7 (permalink)  
Antiguo 24/06/2015, 09:41
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Función previa a ejecutar una función estática

Cita:
Iniciado por iblancasa Ver Mensaje
Que yo sepa lo tienes que hacer con todos. No existe nada como lo que dices.

EDITO:



No lo conocía. Muy útil :D
si no te funciona esto tienes que poner el string en un EVAL y listo

eval("self::mimetodo();");
  #8 (permalink)  
Antiguo 24/06/2015, 10:13
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: Función previa a ejecutar una función estática

zeuslife puedes mostrar un fragmento de la clase, pero supongo que estas lanzando una excepción desde esos métodos es correcto eso ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 24/06/2015, 10:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Función previa a ejecutar una función estática

Cita:
Yo quiero saber si hay algún método mágico o similar [...]
Para eso tienes los métodos mágicos, y __callStatic() hace justamente eso: http://php.net/manual/es/language.oo...ect.callstatic
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 25/06/2015, 02:12
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Función previa a ejecutar una función estática

¡Gracias a todos por responder!

La clase que quiero heredar es Eloquent de Laravel (especificamente la 4.2). La idea de heredarlo es que quiero controlar los herrores a "bajo nivel" para que cuando, por ejemplo falle la conexión a la bbdd, haga un retry sin tener que hacerlo manualmente a "alto nivel".

El problema es que hay muchísimos metodos, y lo que nos gustaría es poder heredarlo y crear una especie de método previo a la llamada de la función final, que compruebe si ha habido alguna excepción, y en tal caso que reintente (según la excepción, claro está), sin tener que reimplementar cada método de la clase padre.

Es decir me gustaría tener una función previa, parecido a lo que ha dado @Patriarca (gracias), pero que me asegure que en caso de fallo recojo la excepción que me lance.


¡Gracias!
__________________
Neversyn Software e Ingeniería
  #11 (permalink)  
Antiguo 25/06/2015, 04:20
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Función previa a ejecutar una función estática

Cita:
Iniciado por zeuslife Ver Mensaje
¡Gracias a todos por responder!

La clase que quiero heredar es Eloquent de Laravel (especificamente la 4.2). La idea de heredarlo es que quiero controlar los herrores a "bajo nivel" para que cuando, por ejemplo falle la conexión a la bbdd, haga un retry sin tener que hacerlo manualmente a "alto nivel".

El problema es que hay muchísimos metodos, y lo que nos gustaría es poder heredarlo y crear una especie de método previo a la llamada de la función final, que compruebe si ha habido alguna excepción, y en tal caso que reintente (según la excepción, claro está), sin tener que reimplementar cada método de la clase padre.

Es decir me gustaría tener una función previa, parecido a lo que ha dado @Patriarca (gracias), pero que me asegure que en caso de fallo recojo la excepción que me lance.


¡Gracias!
y bueno en el catch y finally lo podes hacer, no se cual es el problema con eso?
  #12 (permalink)  
Antiguo 26/06/2015, 10:23
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: Función previa a ejecutar una función estática

El detalle es que Eloquent no es una clase estática, y ya maneja las excepciones a bajo nivel solo tienes que usar un try/catch en tu controller.
Código PHP:
Ver original
  1. try {
  2.     $newUser = User::create(
  3.         [
  4.             'username' => Input::get('username'),
  5.         ]
  6.     );
  7. } catch (\Exception $e) {
  8.     //manejo de excepción
  9. }
Si requieres hacer el rollback
Código PHP:
Ver original
  1. DB::beginTransaction();
  2.  
  3. try {
  4.     $newUser = User::create(
  5.         [
  6.             'username' => Input::get('username'),
  7.         ]
  8.     );
  9. } catch (\Exception $e) {
  10.     DB::rollBack();
  11. }
  12.  
  13. DB::commit();
Esta misma lógica se puede meter a un servicio que capture la excepción, mire de que tipo es mediante instanceof y te dispare la que necesites en el controlador para manejarla.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #13 (permalink)  
Antiguo 01/07/2015, 02:11
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Función previa a ejecutar una función estática

Claro, pero la cuestión es que, por ejemplo, para fallos con el tema de los commit, estos no son controlados, y nos gustaría que para ciertos casos (error de conexión a db o similar) se hiciese algún tipo de retry automático.

De ahí el ponerlo a más bajo nivel.
__________________
Neversyn Software e Ingeniería
  #14 (permalink)  
Antiguo 01/07/2015, 03:55
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: Función previa a ejecutar una función estática

A ver, yo para esto no lo haria, pero bueno...
Puedes crear una clase derivada, renombrar sus metodos usando runkit, (poniendoles a todos un "_" por delante), y usar el metodo mágico call para capturar todas las llamadas a métodos.
Esta técnica es usada, por ejemplo, en el toolkit dojo para implementar programación orientada a aspectos (funciones a llamar antes o despues de la ejecución de un metodo)
  #15 (permalink)  
Antiguo 02/07/2015, 09:16
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: Función previa a ejecutar una función estática

Cita:
Iniciado por zeuslife Ver Mensaje
Claro, pero la cuestión es que, por ejemplo, para fallos con el tema de los commit, estos no son controlados, y nos gustaría que para ciertos casos (error de conexión a db o similar) se hiciese algún tipo de retry automático.

De ahí el ponerlo a más bajo nivel.
Y cual es el problema ? solo tienes que capturar la excepción PDOException y actuar en consecuencia.
Código PHP:
Ver original
  1. try {
  2.     $newUser = User::create(
  3.         [
  4.             'username' => Input::get('username'),
  5.         ]
  6.     );
  7. } catch (\PDOException $e) {
  8.     //intentas reconectar
  9. }
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: static
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 11:04.