Se eu tiver várias classes com funções necessárias, mas desejar armazenar separadamente para a organização, posso estender uma classe para ter as duas?
ie class a extends b extends c
edit: Eu sei como estender as classes uma de cada vez, mas estou procurando um método para estender instantaneamente uma classe usando várias classes base - AFAIK, você não pode fazer isso em PHP, mas deve haver maneiras de contornar isso sem recorrer a class c extends b
,class b extends a
Respostas:
Respondendo à sua edição:
Se você realmente deseja fingir herança múltipla, pode usar a função mágica __call ().
Isso é feio, embora funcione do ponto de vista do usuário da classe A:
Imprime "abcdef"
fonte
Você não pode ter uma classe que estenda duas classes base. Você não poderia ter.
No entanto, você pode ter uma hierarquia da seguinte maneira ...
e assim por diante.
fonte
Você pode usar características que, esperamos, estarão disponíveis no PHP 5.4.
Traits é um mecanismo para reutilização de código em linguagens de herança única, como PHP. Um Trait visa reduzir algumas limitações de herança única, permitindo que um desenvolvedor reutilize conjuntos de métodos livremente em várias classes independentes que vivem em diferentes hierarquias de classes. A semântica da combinação de características e classes é definida de uma maneira que reduz a complexidade e evita os problemas típicos associados à herança múltipla e aos Mixins.
Eles são reconhecidos por seu potencial em oferecer suporte a melhor composição e reutilização, portanto, sua integração em versões mais recentes de idiomas como Perl 6, Squeak, Scala, Slate e Fortress. Traços também foram portados para Java e C #.
Mais informações: https://wiki.php.net/rfc/traits
fonte
Classes não devem ser apenas coleções de métodos. Supõe-se que uma classe represente um conceito abstrato, com o estado (campos) e o comportamento (métodos) que alteram o estado. Usar a herança apenas para obter o comportamento desejado parece um projeto ruim de OO, e exatamente o motivo pelo qual muitas linguagens desaprovam a herança múltipla: para impedir a "herança de espaguete", ou seja, estendendo 3 classes porque cada uma tem um método que você precisa e terminando com uma classe que herda 100 métodos e 20 campos, mas usa apenas 5 deles.
fonte
Existem planos para adicionar mix-ins em breve, acredito.
Mas até então, vá com a resposta aceita. Você pode resumir um pouco isso para criar uma classe "extensível":
Observe que, neste modelo, "OtherClass" conhece '$ foo'. OtherClass precisa ter uma função pública chamada "setExtendee" para configurar esse relacionamento. Então, se seus métodos forem chamados a partir de $ foo, ele poderá acessar $ foo internamente. Entretanto, ele não terá acesso a quaisquer métodos / variáveis privados / protegidos, como uma classe estendida real faria.
fonte
Use traços como classes base. Em seguida, use-os em uma classe pai. Estenda.
Veja agora a mulher de negócios herdou logicamente os negócios e os humanos;
fonte
BusinessWoman
vez deBusinessPerson
? Então você pode ter uma herança múltipla real.fonte
A resposta atualmente aceita por @Franck funcionará, mas na verdade não é uma herança múltipla, mas uma instância filho da classe definida fora do escopo; também existe uma
__call()
abreviação - considere usar em$this->childInstance->method(args)
qualquer lugar que você precise do método da classe ExternalClass na classe "estendida".Resposta exata
Não, você não pode, respectivamente, não realmente, como diz o manual da
extends
palavra-chave :Resposta real
No entanto, como o @adam sugeriu corretamente, isso NÃO proíbe o uso de várias heranças hierárquicas.
Você pode estender uma classe, com outra e outra com outra e assim por diante ...
Um exemplo bem simples disso seria:
Nota importante
Como você deve ter notado, você só pode fazer várias inter-relações (2+) por hierarquia se tiver controle sobre todas as classes incluídas no processo - ou seja, não poderá aplicar esta solução, por exemplo, com classes internas ou com classes que você simplesmente não pode editar - se você quiser fazer isso, fica com a solução @Franck - instâncias filho.
... E, finalmente, exemplo com alguma saída:
Quais saídas
fonte
Eu li vários artigos desencorajando a herança em projetos (em oposição a bibliotecas / estruturas) e incentivando a programar interfaces contra uma interface, não contra implementações.
Eles também defendem OO por composição: se você precisar das funções nas classes a e b, faça c com membros / campos desse tipo:
fonte
A herança múltipla parece funcionar no nível da interface. Eu fiz um teste no php 5.6.1.
Aqui está um código de trabalho:
Não achei que fosse possível, mas me deparei com o código-fonte SwiftMailer, na classe Swift_Transport_IoBuffer, que tem a seguinte definição:
Ainda não brinquei com ele, mas achei interessante compartilhar.
fonte
Acabei de resolver meu problema de "herança múltipla" com:
Dessa forma, eu tenho o poder de manipular a sessão dentro de um SessionResponse que estende o MyServiceResponsetype ainda sendo capaz de lidar com a sessão por si só.
fonte
Se você deseja verificar se uma função é pública, consulte este tópico: https://stackoverflow.com/a/4160928/2226755
E use o método call_user_func_array (...) para muitos argumentos ou não.
Como isso :
fonte
Você pode fazer isso usando Traits no PHP, anunciados a partir do PHP 5.4
Aqui está um tutorial rápido para você, http://culttt.com/2014/06/25/php-traits/
fonte
O PHP ainda não suporta herança de várias classes; no entanto, suporta herança de múltiplas interfaces.
Veja http://www.hudzilla.org/php/6_17_0.php para alguns exemplos.
fonte
O PHP não permite herança múltipla, mas é possível implementar várias interfaces. Se a implementação for "pesada", forneça implementação esquelética para cada interface em uma classe separada. Em seguida, você pode delegar toda a classe de interface para essas implementações esqueléticas via contenção de objetos .
fonte
Sem saber exatamente o que você está tentando alcançar, sugiro examinar a possibilidade de redesenhar seu aplicativo para usar composição em vez de herança neste caso.
fonte
Sempre uma boa idéia é fazer a classe pai, com funções ... ou seja, adicionar toda essa funcionalidade ao pai.
E "mova" todas as classes que usam isso hierarquicamente para baixo. Eu preciso - reescrever funções, que são específicas.
fonte
Um dos problemas do PHP como linguagem de programação é o fato de que você pode ter apenas uma herança. Isso significa que uma classe só pode herdar de outra classe.
No entanto, na maioria das vezes, seria benéfico herdar de várias classes. Por exemplo, pode ser desejável herdar métodos de duas classes diferentes para impedir a duplicação de código.
Esse problema pode levar à classe que tem uma longa história familiar de herança que geralmente não faz sentido.
No PHP 5.4, um novo recurso da linguagem foi adicionado, conhecido como Traits. Um Trait é como um Mixin, pois permite misturar classes de Trait em uma classe existente. Isso significa que você pode reduzir a duplicação de código e obter os benefícios, evitando os problemas de herança múltipla.
Traits
fonte
Esta não é uma resposta real, temos aulas duplicadas
... mas funciona :)
classe copy_B é copiar toda classe B
agora
fonte
classe A estende B {}
classe B estende C {}
Então A estendeu B e C
fonte
B
. O que queremos na maioria das vezes é ter duas classes não relacionadasB
eC
(provavelmente de bibliotecas diferentes) e ser herdadas simultaneamente porA
, de modo queA
contenha tudo de ambosB
eC
, masB
não contenha nadaC
e vice-versa.