Eu tive a chance de ter uma conversa interessante com meus colegas de trabalho. A maioria deles são scripts de ação em flash ou desenvolvedores Java.
Nós conversamos sobre como o php lida com o OOP. Eu disse que o PHP pode lidar com quase todas as coisas OOP a partir do PHP 5.2 ou 5.3. Estou errado? Não estou tentando obter resposta sim / não, mas gostaria de ouvir mais opiniões dos desenvolvedores.
php
object-oriented
user23583
fonte
fonte
Respostas:
O PHP 5.3 na verdade tem um suporte bastante decente para OOP.
O problema com o PHP em relação ao POO é que o POO realmente estava ligado à linguagem, enquanto que em linguagens como Java e ActionScript isso faz parte do conceito principal, embora eu considere as duas linguagens POO ruins por causa de sua má semântica de objetos.
Embora hoje em dia o PHP seja amplamente adequado para OOP, o problema é que:
array
ainda é o tipo mais importante e mais usado e não é um objeto.O PHP não pode simplesmente se livrar de todas as coisas herdadas. Se um PHP 6 fosse lançado, o que jogaria a maior parte fora, provavelmente não seria usado. Isso derrotaria seu objetivo.
E o PHP falhou em tomar um ritmo suficiente de depreciação gradual das coisas. Portanto, levará algum tempo até obter a clareza e consistência necessárias que uma boa linguagem deve ter.
Pessoalmente, eu realmente não gosto de PHP, simplesmente por causa de toda essa bagagem, a API e tudo mais.
No entanto, estruturas como Flow3, Symfony, CakePHP e Codeigniter fornecem uma base sólida para OOP e outros paradigmas poderosos. Devido à restrição do ActionScript e do Java, com esforço suficiente (uma camada de abstração sobre as falhas do PHP), o PHP pode estar em pé de igualdade ou até superá-las.
Para resumir: Não há nada de particularmente errado com os recursos de POO do PHP. Portanto, você poderia dizer que não é uma linguagem OO ruim . No entanto, há muitas coisas particularmente erradas no PHP, como as instalações OOP realmente não sendo integradas , mas apenas incluídas , portanto, você pode argumentar que é uma linguagem OO ruim .
fonte
Você verá que " pode lidar " não é o mesmo que " suportes ". Quero dizer, no âmago da questão, mesmo C " pode lidar com " OOP se você estruturar seu código corretamente. A questão é se o idioma vai ou não além de apenas permitir que o OOP o incentive, tornando o OOP a maneira mais natural de programar.
Na minha experiência (reconhecidamente limitada), os dialetos do PHP 5.n não fazem isso. É muito fácil sair do OOP e entrar em código praticamente puramente processual. (Observe que eu não acho que o PHP seja uma linguagem ruim por esse motivo. Existem muitas razões pelas quais eu acho que o PHP é uma linguagem ruim, mas o suporte ao OOP não é um deles.;)
fonte
$e = function_that_returns_an_array()[0];
. Aqui está o que você tem que fazer para corrigi-lo:$a = function_that_returns_an_array(); $e = $a[0];
. Os idiomas cuja sintaxe não permite que você use diretamente o resultado de uma chamada de função me indicam. Além disso, me diga o que o seguinte número é em decimal:0246875
. (Dica: você não conseguirá encontrar uma maneira mais burra de implementar esse lexer!) O PHP está repleto desse tipo de estupidez.Na verdade, existem duas definições da orientação a objetos de uma linguagem: como a orientação a objetos é sua própria sintaxe e bibliotecas padrão e qual a influência que ela tem sobre os programadores de software que escrevem para ela.
Pela primeira definição, o PHP parece estar no final da lista. As pessoas costumam citar cadeias e matrizes que não são objetos, como evidência disso. Na minha opinião, essa definição realmente não importa. Você sempre pode envolvê-lo em um objeto se realmente precisar de um, mas as pessoas não precisam porque não precisam . Geralmente, a única diferença que ele fará no código está mudando
function(var)
paravar.function()
. Somente a sintaxe não altera algo de não OOP para OOP.Quanto à segunda definição, as pessoas conseguem escrever código mal orientado a objetos, mesmo em linguagens que impõem fortemente tais construções, e as pessoas que escrevem código bom orientado a objetos quase não são afetadas pela linguagem, exceto por serem incomodadas por peculiaridades sintáticas. Em outras palavras, na minha experiência, não há linguagens orientadas a objetos ruins, apenas programadores orientados a objetos ruins . PHP é tão bom quanto qualquer outra linguagem a esse respeito.
Talvez algumas linguagens sejam mais adequadas para o aprendizado de programação orientada a objetos, mas acho que isso será diferente para o desenvolvedor. Para mim, não funcionou até ler o livro de camelos de Larry Wall sobre como o perl faz (fez?) OOP. Ter que abençoar explicitamente as referências como pertencentes a uma classe realmente me levou a entender o que realmente é uma instância de um objeto versus o que é uma classe. Algumas pessoas preferem a abordagem de objetos todos os tempos do Java para o aprendizado. Como o POO é mais uma preocupação arquitetônica, é mais fácil aprender depois que você conhece variáveis básicas, expressões, sequência, seleção e iteração; portanto, qualquer idioma que não impeça o POO imediatamente tem uma vantagem educacional na minha opinião.
Quando minha esposa fez uma introdução à aula de programação com java, ela ficava constantemente frustrada com o fato de
public static void main
colocar tudo em uma aula, que ela ainda não tinha conhecimento para entender, mas foi instruída pela professora apenas para confiar que ela precisava. Tentei explicar, mas é muito difícil explicar a alguém que mal aprendeu sobre variáveis por que seria útil impedir outras partes do código de acessá-las e como decidir como dividi-lo. Você pode argumentar que o aprendizado de programação procedural inculca maus hábitos, mas e o hábito de copiar e colar código que você não entende?fonte
PHP não é ruim para programação orientada a objetos. No entanto, a natureza do PHP incentiva hacks e correções rápidas em relação ao desenvolvimento adequado de software orientado a objetos, e muitos livros e tutoriais ignoram completamente os conceitos de POO. Ele suporta os conceitos de OOP, mas é o ônus do desenvolvedor saber aplicá-los. Você pode fazer quase tudo o que você pode fazer em PHP em uma linguagem OOP "verdadeira", como Java ou C #, mas essas linguagens têm mais aplicação das técnicas de OOP do que PHP, que pode ser usado no estilo processual, se você preferir.
Não me lembro da citação exata, mas foi de alguém que comparou o PHP bruto ao uso do então novo Ruby on Rails, e foi algo assim: o Rails facilita a escrita de bons códigos e a escrita de códigos ruins. O PHP facilita a escrita de códigos ruins e dificulta a escrita de códigos ruins. A linha sobre PHP resume bastante no OOP; é perfeitamente capaz de ser uma boa linguagem OO, mas torna um pouco mais difícil fazê-lo.
fonte
Categorizado PHP
PHP é apenas uma linguagem de cola, como BASH ou Perl. É bom nisso, mas não é bom em qualquer outra coisa, deixando de lado algum trabalho sério. O idioma não foi projetado. Ele é apenas evoluído ao hackear vários códigos juntos de maneira aleatória (código e correção).
Idiomas compilados
Ao contrário do PHP, Java é uma linguagem compilada que foi projetada adequadamente. Existem JSRs que definem a linguagem, muitas estruturas e conceitos de nível corporativo, como EJB, JMS, ESB, Spring, Struts, Hibernate e outros.
Software empresarial
Em termos de sistemas corporativos, o Java EE é uma solução adequada ao objetivo (Enterprise Edition), enquanto o PHP é usado em empresas que estão tentando reduzir custos, contratando mão de obra barata e com qualificações menores.
Houve um esforço considerável para arrastar o PHP para o segmento Enterprise usando várias estruturas. Mais notavelmente, o Zend Framework 2 . O problema fundamental aqui não é a orientação a objetos do PHP, mas é a falta de design, falta de digitação forte, soluções não padrão para problemas padrão (tipo de hacks para tudo) e uma falta completa de qualquer arquitetura prescrita.
Design de software (arquitetura discutida)
Com o PHP, o ônus da arquitetura de software ainda depende inteiramente dos desenvolvedores que estão fazendo um trabalho muito ruim, ou seja, geralmente não possuem nenhuma arquitetura, apenas codificam e corrigem aleatoriamente. Faltam segurança e transações e precisam ser ignoradas pelos desenvolvedores. Em Java, uma solução é EJB anotada. Considere também o fato de que, no PHP, nada acontece se você omitir a captura de exceções ou cometer vários erros. Isso é até o tempo de execução. Com o Java, você receberá avisos e erros diretamente no tempo de design. Isso se chama robustez, mas com o PHP você só pode continuar sonhando.
Multithreading
O PHP não suporta multithreading. O código é sempre um único thread. Isso prejudica seu desempenho em problemas não triviais sob carga mais pesada. Com o Java EE, o multithreading é totalmente suportado, por exemplo, através da interface Runnable.
Suporte e padrões
Considere também a implantação, serviços da Web e outros padrões. Enquanto em Java existem grandes empresas como Oracle, IBM, RedHat, Apache e muitas outras, o PHP possui apenas o Zend.
Conclusão
Para concluir, o PHP é uma péssima linguagem orientada a objetos. A rigor, nem sequer é orientado a objetos, mas híbrido, o que é ruim nas versões> 5 porque o OOP está misturado com a programação procedural. Eu recomendaria apenas o PHP como uma cola como o BASH, mas para trabalhos sérios eu usaria o Java EE.
Pensamentos Relacionados
O principal acordo com o Zend Framework 2 mais recente é que ele está tentando se parecer com o Java EE, mas falha completamente em fornecer pelo menos um conjunto remotamente comparável de pacotes, recursos, ferramentas, automação, verificação de erros, arquitetura, design e tudo.
Na minha experiência, é mais caro usar o PHP para projetos complexos do que com o Java.
Existem também alguns rumores como o de que PHP significa Pretty Horrible Programming . Eu posso confirmar isso.
fonte
Quão bem um idioma lida com OOP? Prefiro perguntar como posso escrever um programa de maneira OO. Posso mexer meu nariz com a postura de tudo que deveria ser uma classe adotada pelo Java, tornando tudo público estático .
PHP suporta OOP; isso não me força a escrever apenas da maneira OO. O quão bem ele lida depende de quão bem eu entendo e escrevo o programa de maneira orientada a objetos.
fonte
O PHP suporta Traits! (começando em 5.4) . Qualquer linguagem que possa lidar com a reutilização horizontal nativa é uma linguagem OO suficientemente boa em meu livro.
fonte
Bem, temos que pensar no que torna uma linguagem mais OO e quais são as razões que a tornaram assim.
O JavaScript é uma implementação do ECMAScript que pretendia ser executada no ambiente do navegador como uma linguagem interpretada . O fato de ser considerada linguagem interpretada teve um efeito muito grande em seu design sintático / comportamental.
Por exemplo, ele não segue OOP. Mas, além disso, existem muitos fatos, como o programador OO pode achar alguns de seus comportamentos como a função de içar muito confusos.
Novamente, muitas coisas vieram com linguagens OO como C ++, Java, C # para torná-las eficientes em compiladores, como digitação forte . No entanto, como o JS é executado em ambiente interpretado, ele não segue a digitação forte, sendo uma linguagem de tipo fraco .
Além das diferenças comportamentais acima, existem muitas diferenças sintáticas, como o JS, com notação literal de objeto que pode muito bem confundir programadores de C #. No entanto, o C # também possui Objeto literal como sintaxe, mesmo que seja uma linguagem compilada e essa sintaxe raramente seja usada, pois não é tradicionalmente o estilo de código OO.
Agora, há mais um ponto que determina se a linguagem é boa OO: ela evoluiu do C ++. Como o Java, o C # é desenvolvido a partir do C ++ e segue comportamentos e sintaxas semelhantes, uma grande comunidade percebe esse comportamento e sintaxe como a única coisa OO , e pensa que qualquer linguagem que não iniba essas semelhanças simplesmente não é OO.
No entanto, não devemos esquecer que OO é um conceito muito abstrato, não está vinculado a nenhum estilo de sintaxe e nem a nenhuma propriedade comportamental específica.
E o PHP está muito bem OO. Simplesmente não parecer e se sentir como Java, C ++, C # não torna a linguagem OO ruim. Bem, eu aprendi C ++, Java e C #.
Então, até agora minha cabeça estava muito bem OO. Então eu aprendi JS de um livro muito bom "Wrox Pro", e isso me exagerou. Eu apenas gostei do comportamento e da distinção sintática de JS. Então percebo que o objeto literal como sintaxe estava no C #. E agora, enquanto aprendo PHP, sinto que ele traz muitas coisas dos dois mundos.
Tudo o que realmente precisamos fazer é aprender as sutilezas de sintaxe e comportamento que uma linguagem possui ao implementar o OO. Depois de dominá-los, podemos começar a pensar que essa é uma melhor implementação de OO.
fonte