Si tengo varias clases con funciones que necesito pero quiero almacenar por separado para la organización, ¿puedo extender una clase para tener ambas?
es decir class a extends b extends c
editar: Sé cómo extender las clases una a la vez, pero estoy buscando un método para extender instantáneamente una clase usando múltiples clases base: AFAIK no puedes hacer esto en PHP, pero debería haber formas de evitarlo sin recurrir a class c extends b
,class b extends a
Respuestas:
Respondiendo tu edición:
Si realmente quieres falsificar una herencia múltiple, puedes usar la función mágica __call ().
Esto es feo aunque funciona desde el punto de vista del usuario de clase A:
Imprime "abcdef"
fuente
No puede tener una clase que extienda dos clases base. No podrías haberlo hecho.
Sin embargo, podría tener una jerarquía de la siguiente manera ...
y así.
fuente
Podrías usar rasgos que, con suerte, estarán disponibles desde PHP 5.4.
Rasgos es un mecanismo para la reutilización de código en lenguajes de herencia única como PHP. Un rasgo está destinado a reducir algunas limitaciones de la herencia única al permitir que un desarrollador reutilice conjuntos de métodos libremente en varias clases independientes que viven en diferentes jerarquías de clases. La semántica de la combinación de Rasgos y clases se define de una manera que reduce la complejidad y evita los problemas típicos asociados con la herencia múltiple y los Mixins.
Son reconocidos por su potencial para apoyar una mejor composición y reutilización, de ahí su integración en versiones más nuevas de lenguajes como Perl 6, Squeak, Scala, Slate y Fortress. Los rasgos también se han portado a Java y C #.
Más información: https://wiki.php.net/rfc/traits
fuente
Las clases no están destinadas a ser solo colecciones de métodos. Se supone que una clase representa un concepto abstracto, con estado (campos) y comportamiento (métodos) que cambia el estado. Usar la herencia solo para obtener un comportamiento deseado suena como un mal diseño de OO, y exactamente la razón por la cual muchos idiomas no permiten la herencia múltiple: para evitar la "herencia de espagueti", es decir, extender 3 clases porque cada una tiene un método que necesita y terminar con una clase que hereda 100 métodos y 20 campos, pero solo usa 5 de ellos.
fuente
Hay planes para agregar mezclas pronto, creo.
Pero hasta entonces, ve con la respuesta aceptada. Puede resumir eso un poco para hacer una clase "extensible":
Tenga en cuenta que en este modelo "OtherClass" llega a "saber" acerca de $ foo. OtherClass necesita tener una función pública llamada "setExtendee" para configurar esta relación. Luego, si sus métodos se invocan desde $ foo, puede acceder a $ foo internamente. Sin embargo, no tendrá acceso a ningún método / variable privado / protegido como lo haría una clase extendida real.
fuente
Usa rasgos como clases base. Luego úselos en una clase para padres. Extiéndelo .
Ver ahora, la mujer de negocios hereda lógicamente los negocios y los humanos;
fuente
BusinessWoman
lugar deBusinessPerson
? Entonces puede tener una herencia múltiple real.fuente
La respuesta actualmente aceptada por @Franck funcionará, pero en realidad no es herencia múltiple sino una instancia secundaria de clase definida fuera de alcance, también existe la
__call()
taquigrafía: considere usar$this->childInstance->method(args)
cualquier lugar donde necesite el método de clase ExternalClass en clase "extendida".Respuesta exacta
No, no puedes, respectivamente, no realmente, como dice el manual de
extends
palabras clave :Respuesta real
Sin embargo, como @adam sugirió correctamente, esto NO le prohíbe usar herencia jerárquica múltiple.
PUEDES extender una clase, con otra y otra con otra y así sucesivamente ...
Entonces, un ejemplo bastante simple sobre esto sería:
Nota IMPORTANTE
Como habrás notado, solo puedes hacer una interacción múltiple (2+) por jerarquía si tienes control sobre todas las clases incluidas en el proceso ; eso significa que no puedes aplicar esta solución, por ejemplo, con clases integradas o con clases que simplemente no puede editar; si desea hacerlo, le queda la solución @Franck: instancias secundarias.
... Y finalmente ejemplo con algo de salida:
Que salidas
fuente
He leído varios artículos que desalientan la herencia en proyectos (a diferencia de las bibliotecas / marcos), y alientan a programar interfaces agaisnt, no en contra de las implementaciones.
También recomiendan la OO por composición: si necesita las funciones en la clase ayb, haga que c tenga miembros / campos de este tipo:
fuente
La herencia múltiple parece funcionar en el nivel de interfaz. Hice una prueba en php 5.6.1.
Aquí hay un código de trabajo:
No pensé que eso fuera posible, pero me topé con el código fuente de SwiftMailer, en la clase Swift_Transport_IoBuffer, que tiene la siguiente definición:
Todavía no jugué con él, pero pensé que podría ser interesante compartirlo.
fuente
Acabo de resolver mi problema de "herencia múltiple" con:
De esta manera, tengo el poder de manipular la sesión dentro de una SessionResponse que extiende MyServiceResponsetype aún siendo capaz de manejar Session por sí mismo.
fuente
Si desea verificar si una función es pública, vea este tema: https://stackoverflow.com/a/4160928/2226755
Y use el método call_user_func_array (...) para muchos o no argumentos.
Me gusta esto :
fuente
Puede hacerlo utilizando Traits en PHP que se anunció a partir de PHP 5.4
Aquí hay un tutorial rápido para usted, http://culttt.com/2014/06/25/php-traits/
fuente
PHP aún no admite la herencia de múltiples clases, sin embargo, admite la herencia de múltiples interfaces.
Consulte http://www.hudzilla.org/php/6_17_0.php para ver algunos ejemplos.
fuente
PHP no permite la herencia múltiple, pero puede hacerlo implementando múltiples interfaces. Si la implementación es "pesada", proporcione una implementación esquelética para cada interfaz en una clase separada. Luego, puede delegar toda la clase de interfaz a estas implementaciones esqueléticas a través de la contención de objetos .
fuente
Sin saber exactamente lo que está tratando de lograr, sugeriría que estudie la posibilidad de rediseñar su aplicación para usar la composición en lugar de la herencia en este caso.
fuente
Siempre es una buena idea hacer una clase padre, con funciones ... es decir, agregar toda esta funcionalidad a padre.
Y "mueva" todas las clases que usan esto jerárquicamente hacia abajo. Necesito reescribir funciones, que son específicas.
fuente
Uno de los problemas de PHP como lenguaje de programación es el hecho de que solo puede tener una herencia única. Esto significa que una clase solo puede heredar de otra clase.
Sin embargo, muchas veces sería beneficioso heredar de múltiples clases. Por ejemplo, podría ser deseable heredar métodos de un par de clases diferentes para evitar la duplicación de código.
Este problema puede llevar a una clase que tiene un largo historial familiar de herencia que a menudo no tiene sentido.
En PHP 5.4 se agregó una nueva característica del lenguaje conocida como Rasgos. Un Rasgo es algo así como un Mixin, ya que le permite mezclar clases de Rasgos en una clase existente. Esto significa que puede reducir la duplicación de código y obtener los beneficios mientras evita los problemas de herencia múltiple.
Rasgos
fuente
Esta no es una respuesta real, tenemos una clase duplicada
...pero funciona :)
clase copy_B es copiar toda la clase B
ahora
fuente
la clase A se extiende B {}
la clase B se extiende C {}
Entonces A ha extendido tanto B como C
fuente
B
. Lo que queremos la mayor parte del tiempo es tener dos clases no relacionadasB
yC
(probablemente de bibliotecas diferentes) y ser heredadas simultáneamente porA
, de modo queA
contenga todo de ambosB
yC
, peroB
no contenga nadaC
y viceversa.