Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO usar metodo estatico o no?

Estas en el tema de usar metodo estatico o no? en el foro de PHP en Foros del Web. Hola a todos, estoy programando una clase y tengo un metodo que obtiene todos los registros de una tabla, ya que siempre va a ser ...
  #1 (permalink)  
Antiguo 11/01/2014, 09:27
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
usar metodo estatico o no?

Hola a todos, estoy programando una clase y tengo un metodo que obtiene todos los registros de una tabla, ya que siempre va a ser igual, me conviene dejarlo como.estatico o no? pongo codigo

dataBaseConnection.php
Código PHP:
Ver original
  1. abstract class dataBaseConnection{
  2. /*
  3. *propiedades
  4. */
  5. protected function open_connection(){
  6.    
  7.           $this->pdo= new PDO('mysql:host='.self::$host.';dbname='.$this->dbname , self::$user, self::$pass);
  8.          
  9.     }
  10.    
  11. protected function close_connection(){
  12.                   $this->pdo=null;
  13.     }
  14. }

newsModel.php
Código PHP:
Ver original
  1. require_once 'dataBaseConnection.php';
  2. class newsModel extends datBaseConnection{
  3.  
  4. /*
  5. *propiedades
  6. */
  7.  
  8. function __construct(){
  9.             $this->dbname="database";
  10.     }
  11.          
  12.     public function getAllNews(){
  13.            $this->query= "SELECT * FROM noticias ORDER BY id DESC";
  14.            $this->open_connection();
  15.            $this->rows=$this->pdo->query($this->query)->fetchAll();
  16.            return $this->rows;
  17.     }
  18. }
me podrian aconsejar, si lo dejo como lo tengo o como estatico, gracias.
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #2 (permalink)  
Antiguo 11/01/2014, 09:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: usar metodo estatico o no?

Estás extendiendo e instanciando, si dicho método hace uso de variables de instancia propias es obvio que no puedes dejar dicho método estático.

Eso de "ya que siempre va a ser igual" no es un argumento muy inteligente que digamos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/01/2014, 09:56
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: usar metodo estatico o no?

Cita:
Iniciado por pateketrueke Ver Mensaje
Estás extendiendo e instanciando, si dicho método hace uso de variables de instancia propias es obvio que no puedes dejar dicho método estático.

Eso de "ya que siempre va a ser igual" no es un argumento muy inteligente que digamos.
Gracias, ese "argumento" lo di porque recuerdo haber.leido aqui en el.foro que si un metodo no cambia y no recibe parametros se "podria" dejar como metodo estatico, me imagino que habre leido mal o no lo entendi bien, pero gracias, alguna otra recomendacion?
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #4 (permalink)  
Antiguo 11/01/2014, 09:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: usar metodo estatico o no?

Cita:
alguna otra recomendacion?
Podrías consultar una referencia de diseño OOP, supongo que ahí se deben explicar dichos detalles.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 11/01/2014, 10:19
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: usar metodo estatico o no?

Gracias, solucionado.
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #6 (permalink)  
Antiguo 11/01/2014, 16:37
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: usar metodo estatico o no?

Que un método "siempre vaya a ser igual", o que use o no variables miembro de una clase, es una consecuencia de que el método sea estático, no la causa.
Un método es estático cuando es un método de clase, no de instancia.
En este caso:
Puedo pedirle a una instancia de newsModel que me dé todas las news que existen en la BD? Es algo que se le pide a una *instancia*, a una cierta noticia?Una noticia puede ser publicada, comentada, desactivada, etc..Pero, que devuelva instancias (o datos de instancias) que no son ella misma?
Puedo pedirle a la clase newsModel que me dé todas las news que existen en la BD? Esto tiene mejor pinta.La clase newsModel no representa a ninguna "news" en particular, y puede hacerse cargo de estas cosas, a falta de una factoría.

Por eso, es muy raro que un método del tipo "getAll-----" necesite variables de instancia.Así he visto que estás derivando modelos de la clase databaseConnection.Aqui hay un error y un comentario:
- El error: la conexión a la bd es una variable miembro *de instancia*.Esto significa que cada instancia, de cada modelo, está abriendo su conexión (!!)..Seguro que no quieres eso.

- El comentario: sé que es una práctica muuuy habitual en ORMs de todo tipo, pero derivar modelos de la clase de DB me parece muy discutible.
Desde el punto de vista de la OOP, es una derivación muy forzada.No tengo tan claro que un objeto News *sea* una conexión a una base de datos (derivación).Ni siquiera que un objeto News *tenga* una conexión a una base de datos (composición).Veo más limpio que un objeto base de datos sepa persistir objetos que deriven de Model.Es decir, el método loadModel() y saveModel() pertenece al objeto "BD", y no a Model (repito, es *mi* punto de vista, sé que en mucha literatura respetable Model deriva de BD).

Y lo que esto significa, es que un objeto "News" es independiente de cómo se *guarda* o se obtiene el objeto.Supón que tuvieras que crear objetos News a partir de un XML, o un json.O, más habitual, que tengas una conexión de lectura (esclavo sql), y otras de escritura (maestro sql). O modelos almacenados en distintas bases de datos.

Esto, en el fondo es así a nivel conceptual.Un modelo es un objeto que pertenece al modelo de negocio de la aplicación.Una tabla de la BD es dónde se almacena, aunque también se almacena, incluso al mismo tiempo, en otros sitios, como memcache, una sesión, una variable..Y no por eso las clases Model derivan de Memcache o Session.
A nivel práctico, es muy sencillo de implementar a nivel de modelo.Pero ser independiente del sistema de almacenamiento para operaciones más allá de manipular un simple modelo, la cosa se complica.
  #7 (permalink)  
Antiguo 11/01/2014, 20:03
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: usar metodo estatico o no?

Cita:
Iniciado por dashtrash Ver Mensaje
Que un método "siempre vaya a ser igual", o que use o no variables miembro de una clase, es una consecuencia de que el método sea estático, no la causa.
Un método es estático cuando es un método de clase, no de instancia.
En este caso:
Puedo pedirle a una instancia de newsModel que me dé todas las news que existen en la BD? Es algo que se le pide a una *instancia*, a una cierta noticia?Una noticia puede ser publicada, comentada, desactivada, etc..Pero, que devuelva instancias (o datos de instancias) que no son ella misma?
Puedo pedirle a la clase newsModel que me dé todas las news que existen en la BD? Esto tiene mejor pinta.La clase newsModel no representa a ninguna "news" en particular, y puede hacerse cargo de estas cosas, a falta de una factoría.

Por eso, es muy raro que un método del tipo "getAll-----" necesite variables de instancia.Así he visto que estás derivando modelos de la clase databaseConnection.Aqui hay un error y un comentario:
- El error: la conexión a la bd es una variable miembro *de instancia*.Esto significa que cada instancia, de cada modelo, está abriendo su conexión (!!)..Seguro que no quieres eso.

- El comentario: sé que es una práctica muuuy habitual en ORMs de todo tipo, pero derivar modelos de la clase de DB me parece muy discutible.
Desde el punto de vista de la OOP, es una derivación muy forzada.No tengo tan claro que un objeto News *sea* una conexión a una base de datos (derivación).Ni siquiera que un objeto News *tenga* una conexión a una base de datos (composición).Veo más limpio que un objeto base de datos sepa persistir objetos que deriven de Model.Es decir, el método loadModel() y saveModel() pertenece al objeto "BD", y no a Model (repito, es *mi* punto de vista, sé que en mucha literatura respetable Model deriva de BD).

Y lo que esto significa, es que un objeto "News" es independiente de cómo se *guarda* o se obtiene el objeto.Supón que tuvieras que crear objetos News a partir de un XML, o un json.O, más habitual, que tengas una conexión de lectura (esclavo sql), y otras de escritura (maestro sql). O modelos almacenados en distintas bases de datos.

Esto, en el fondo es así a nivel conceptual.Un modelo es un objeto que pertenece al modelo de negocio de la aplicación.Una tabla de la BD es dónde se almacena, aunque también se almacena, incluso al mismo tiempo, en otros sitios, como memcache, una sesión, una variable..Y no por eso las clases Model derivan de Memcache o Session.
A nivel práctico, es muy sencillo de implementar a nivel de modelo.Pero ser independiente del sistema de almacenamiento para operaciones más allá de manipular un simple modelo, la cosa se complica.
Creo entender lo que dices (a lo mejor no), la clase para obtener las news, no debe extender la clase bd, si.no, instanciarla?
Pretendo hacer una clase para obtener las news y otra para guardarlas, esta mal asi? Todo lo hago guiandome de un libro que encontre.
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #8 (permalink)  
Antiguo 14/01/2014, 15:38
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: usar metodo estatico o no?

Cita:
Iniciado por xSkArx Ver Mensaje
Creo entender lo que dices (a lo mejor no), la clase para obtener las news, no debe extender la clase bd, si.no, instanciarla?
Pretendo hacer una clase para obtener las news y otra para guardarlas, esta mal asi? Todo lo hago guiandome de un libro que encontre.
Instanciarla, nunca, ya que entonces crearías 1 conexión por cada objeto que crees.Eso es lo que pasa ahora con el código.
Hay 3 alternativas: lo que te está diciendo que hagas el libro que encontraste (y, si no, debería decirtelo), es lo siguiente, en la clase base:
Código PHP:
Ver original
  1. <?php
  2.     class databaseConnection
  3.     {
  4.             static $connection=null;
  5.             private __construct(){}
  6.             function getConnection()
  7.             {
  8.                     if(databaseConnection::$connection==null){
  9.                         /* abrir la conexion y asignarla a $connection
  10.                     }
  11.                   return databaseConnection::$connection;
  12.             }
  13.  
  14.      }
  15. ?>
Basicamente, un singleton.En la clase derivada, debes llamar a getConnection() para obtener la conexión, y no almacenarla en una variable de instancia (no estática).
Como singleton que es, no puedes llamar desde la derivada al constructor de la base, lo cual puede complicar algo las cosas.

A partir de ahi, si quieres derivar esta clase, instanciarla, o pasarla como parámetro, al menos, no estarás creando una conexión por objeto.

Etiquetas: estatico, metodo, registro, select, sql, tabla, usar
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 17:43.