2011-05-13 16 views
6

Estoy tratando de encontrar la mejor forma de completar mi trabajo de diseño en mis clases.php clases e interfaces abstractas que implican métodos estáticos?

mi situación.

tengo una clase abstracta para que contiene métodos de pedido e información que se requieren para 2 clases de los niños

order_Outbound

y order_inbound

cada clase niño requiere 2 método public static llamado crear y obtener

pero por lo que he leído sobre php 5.3 no puede tener métodos estáticos abstractos ???

así que pensé en tener una interfaz Order_Interface que asume ese rol pero cómo lo implemento. ¿Todavía lo implemento en la clase padre

en cuyo caso la clase abstracta padre todavía me requiere crear un método get y create dentro de la clase abstracta. ¿O lo implemento en los niños y extiendo desde la clase abstracta?

TAMBIÉN !!! tanto la ida y niños entrantes requieren un crear método estático, sino que requieren diferentes parámetros a ser pasados ​​

puedo en la interface tienen la función public static crear()

y en su implementación dentro order_outbound declaran que la función public static create ($ address, $ reference, $ orderID)

+0

No veo el código, así que es solo una suposición, pero 'Order :: create()' y 'Order :: get()' probablemente no deberían ser estáticos a menos que tenga algunas razones para hacerlo ellos estáticos. – Crozin

+0

@Crozin: si no desea utilizar constructores por algún motivo y desea un método para crear instancias, probablemente no desee tener que crear una instancia para llamar al método de creación de instancias. –

+0

lo siento, sí, eso es exactamente por qué lo estoy haciendo. las clases representan los registros de la base de datos. mis constructores están protegidos y usan métodos estáticos para recuperar instancias de las clases. – roguecoder

Respuesta

6

En la mayoría de los lenguajes, incluido PHP, no es necesario que una clase implemente métodos estáticos.

Esto significa que ni la herencia de clase ni las interfaces le permitirán exigir a todos los implementadores que definan un método estático. Esto es probablemente porque estas características están diseñadas para soportar el polimorfismo en lugar de la definición de tipo. En el caso de los métodos estáticos, nunca tendrás un objeto para resolver el tipo, por lo que tendrías que hacer ClassName::Method explícitamente, por lo que la teoría es que no obtendrías nada del polimorfismo.

Como tal, veo tres soluciones

  1. Declaración de los métodos estáticos en cada categoría (después de todo, que nunca van a

  2. Si desea una método para crear instancias de la clase , pero no desea requerir una instancia para llamar a este método, puede crear clases "Generador" para cumplir este propósito (por ejemplo, OrderBuilder), de modo que instancia un OrderBuilder y llame al método Create en este objeto para obtener Order instancias

  3. (Recomendado) ¿Por qué no está utilizando simplemente el constructor Order?

+0

en mi base de datos tengo 2 tablas. orderheader y orderbody. hay 2 tipos de órdenes de salida y de entrada. No quiero la capacidad de crear una instancia del objeto sin que exista un registro de la base de datos. lo que hace que el constructor esté protegido y permite que las personas solo obtengan una instancia mediante la creación de un nuevo registro de base de datos (order_outbound :: create()) o recupera un registro que ya está almacenado (order_outbound :: get (id)). – roguecoder

+0

porque nunca pretendo que estas 2 clases se extiendan, ¿su sugerencia es simplemente ignorar la interfaz y la clase abstracta e ingresar los métodos estáticos en cada clase individualmente sin que exista un nivel superior que me obligue a hacerlo? – roguecoder

+0

Diría que si no quieres usar un constructor, entonces usa los métodos estáticos y no te cuelgues en el bit de "forzar nivel superior". –

0

Sí, los métodos estáticos abstractos se eliminaron en PHP 5.2. Aparentemente eran un descuido. Ver Why does PHP 5.2+ disallow abstract static class methods?.

Sin embargo, puede tener métodos estáticos en una interfaz, consulte this comment on php.net.

El problema al que se enfrenta es que desea que sus implementaciones tengan diferentes firmas de funciones, lo que significa que probablemente no deba utilizar la herencia para resolver su problema.

Cuestiones relacionadas