Article image
Letícia Machado
Letícia Machado14/02/2023 12:58
Compartilhe

Java X PHP: uma comparação da implementação do paradigma OO

  • #PHP
  • #Java

Meu primeiro contato com Java foi em 2019, mesmo ano em que conheci o PHP. Apesar de trabalhar com ambos para objetivos diferentes, eles possuem algo em comum que eu não sabia até pouco tempo: implementam o paradigma OO (orientado a objetos).

Curiosa para entender como o PHP lida com as questões da orientação a objetos, e com um bom incentivo de professores, resolvi escrever esse artigo para comparar as duas linguagens, desde sua criação, até a implementação da OO. Vou compartilhar alguns conhecimentos que obtive durante essa jornada com vocês, espero que aproveitem!


História

A linguagem Java surgiu em 1991, desenvolvida por uma empresa filiada à Sun, com o objetivo de facilitar a comunicação entre dispositivos eletrônicos. A linguagem foi criada por James Gosling, e ganhou uma grande oportunidade em 1995, época em que as páginas web eram estáticas, quando foi anunciado o ambiente Java, que permitia a criação de páginas web muito mais elaboradas e interativas.

Principais características da linguagem:

  • Orientada a objetos;
  • Compilada e interpretada (híbrida);
  • Dinamismo;
  • Segurança;
  • Independente de plataforma.

Outro fator que influenciou o sucesso do Java até os dias atuais é a independência de plataforma: um código que pode ser executado em um computador com determinado sistema operacional/processador pode ser executado também em outro computador com características físicas completamente diferentes. Isso só é possível por conta da JVM (Java Virtual Machine), que funciona como um sistema operacional desenvolvido exclusivamente para interpretar arquivos .class compilados pelo compilador Java.

A primeira versão da linguagem PHP surgiu em 1994, desenvolvida por Rasmus Lerdof, que era apenas um conjunto de binários Common Gateway Interface (CGI) escrito em linguagem de programação C. Esse conjunto de scripts foi chamado de Personal Home Page Tools, já que seu objetivo inicial era acompanhar quem visitou seu currículo online. Com o tempo, outras funcionalidades foram implementadas, para garantir interação com banco de dados e páginas mais dinâmicas, e em junho de 1995 Rasmus resolveu disponibilizar o código fonte para que desenvolvedores pudessem utilizá-lo da maneira que quisessem. Esse processo facilitou a correção de bugs e, consequentemente, melhorias no código.

Em outubro de 1995, foi liberado um código fonte completamente diferente, agora podendo chamar o PHP de script de interface avançado. Era, propositalmente, parecida com C e Pearl, e, até então, exclusiva para sistemas UNIX e sistemas compatíveis com POSIX, porém a implementação em Windows NT começou a ser viável.

O código foi reformado completamente em abril de 1996. Foi essa versão (PHP 2.0) que fez o PHP deixar de ser um conjunto de ferramentas e se tornar uma linguagem de programação, com recursos como suporte embutido de bancos de dados (DBM, MySQL e Postgres95), funções de apoio definidas pelo usuário, cookies, entre outros. Algumas características da linguagem são:

  1. Paradigmas: imperativo, funcional, orientado a objetos;
  2. Código aberto;
  3. Linguagem interpretada;
  4. Suporte diversos protocolos (IMAP, SNMP, NNTP, POP3, HTTP, etc);
  5. Multiplataforma.


Evolução

A imagem abaixo ilustra a evolução das linguagens de programação Java e PHP.

image

Figura 1. Evolução do Java e PHP.


Destaca-se que a versão 6.0 do PHP foi descartada, apesar de planejar incluir suporte nativo de Unicode. Essa mudança não pode ser implementada na época porque os desenvolvedores envolvidos não entendiam quais eram as mudanças necessárias para que o suporte funcionasse corretamente. 


Adequação ao paradigma OO

Como visto na evolução, o PHP não foi criado para ser orientado a objetos, sendo que esse paradigma só foi implementado na sua terceira versão. O PHP também implementa os paradigmas funcional e imperativo. Já a linguagem Java foi pensada inicialmente para ser orientada a objetos. As características principais de uma linguagem orientada a objetos são: classes, objetos, herança e polimorfismo.

Em java, temos o seguinte código para a criação da classe Retângulo:

public class Retangulo {
  private float base;
  private float altura;

  public void calcularPerimetro() {
      float perimetro = this.base * 2 + this.altura * 2;
      System.out.println("Perímetro: " + perimetro);
  }

  public void calcularArea() {
      float area = this.base * this.altura;
      System.out.println("Área: " + area);
  }
}

Nas linhas 3 e 4, há a definição dos atributos da classe. Já nas linhas 6 e 11, são criados os métodos calcularPerimetro() e calcularArea(), respectivamente. O mesmo código, em PHP, ficaria da seguinte maneira:

<?php
class Retangulo {

  private float $base;
  private float $altura;

  public function calcularPerimetro() {
      $perimetro = $base * 2 + $altura * 2;
      echo "Perímetro: " . $perimetro;
  }

  public function calcularArea() {
      $area = $base * $altura;
      echo "Área: " . $area;
  }
}

Para instanciar objetos da classe retângulo, seriam necessários os códigos abaixo.

public static void main(String[] args) {
  Retangulo r1 = new Retangulo();
  r1.setBase(5);
  r1.setAltura(3);
  r1.calcularPerimetro();
  r1.calcularArea();
  System.out.println("Base: " + r1.getBase());
  System.out.println("Altura: " + r1.getAltura());

}
$retangulo1 = new Retangulo();
$retangulo1->base = 5;
$retangulo1->altura = 3;
$retangulo1->calcularPerimetro();
$retangulo1->calcularArea();
echo "Base: " . $retangulo1->base;
echo "Altura: " . $retangulo1->altura;

Para acessar um atributo de uma classe em Java, é necessário utilizar um método getAtributo(). O PHP é mais prático nesse sentido, já que tanto os atributos quanto os métodos das classes podem ser obtidos utilizando apenas ->atributo ou ->metodo().

De acordo com o manual do PHP, quando falamos de herança, é necessário que a classe pai seja declarada antes de ser estendida à outra classe. Em termos práticos, herança em PHP ocorre da seguinte maneira:

<?php
class Pessoa {

  private string $cpf;
  private string $nome;

  public function getPessoa() {
      echo 'Pessoa = CPF: ' . $cpf . ' | Nome: ' . $nome;
  }

  public function printMensagem($mensagem) {
      echo 'Mensagem: ' . $mensagem;
  }
}

Uma classe que estende a classe pai poderá utilizar de todos os seus métodos, além de possuir também todos os seus atributos. Sendo assim, a classe filho em PHP pode ser demonstrada da maneira abaixo:

class Aluno extends Pessoa{
  private string $prontuario;
  private float $ira;
  
  public function getPessoa(){
      echo 'Aluno = CPF: ' .$cpf . ' | Nome: ' . $nome .
              ' | Prontuário: ' . $prontuario . ' | IRA: ' . $ira;
  }
}

Nota-se que na classe filho é feito uma reescrita do método getPessoa(). Isso significa que um objeto que é uma instância da classe filho (Aluno), irá executar o método getPessoa() da classe Aluno, já que este foi sobrescrito. Para criar instâncias das classes criadas, temos o seguinte código:

$pessoa = new Pessoa();
$aluno = new Aluno();
$pessoa->getPessoa();
$pessoa->printMensagem('Mensagem com pessoa');
$aluno->getAluno();
$aluno->printMensagem('Mensagem com aluno');

Na linguagem Java, a classe Pessoa pode ser descrita como no código abaixo.

 public class Pessoa {
  private String cpf;
  private String nome;

  public void printMensagem(String mensagem){
      System.out.println(mensagem);
  }

   public void getPessoa() {
      System.out.println("Pessoa = " + " CPF: " + cpf + " | Nome:" + nome);
  }
}

Já a classe Aluno, pode ser representada da maneira mostrada a seguir.

public class Aluno extends Pessoa{
  private String prontuario;
  private float ira;


  @Override
  public void getPessoa() {
      System.out.println("Pessoa = " + " CPF: " + super.getCpf() + " | Nome:" + super.getNome() + 
              " | Prontuário: " + prontuario + " | IRA: " + ira);
  }
}

Em java, quando uma classe filho sobrescreve um método da classe pai, é aconselhável utilizar a anotação @Override, para marcar que aquele método pertence a uma outra classe. Além disso, é possível obter os atributos da classe pai utilizando super.getAtributo(), já que o comando super é utilizado quando nos referimos a classe pai. A instância das classes está demonstrada no código abaixo. 

public static void main(String[] args) {
  Pessoa p = new Pessoa();
  p.getPessoa();
  p.printMensagem("Mensagem com pessoa");
  Aluno a = new Aluno();
  a.getPessoa();
  a.printMensagem("Mensagem com aluno");    
}

Para exemplificar melhor o conceito de polimorfismo em PHP, foi desenvolvido um código que declara uma classe abstrata Animal que possui apenas a função abstrata locomover()

<?php
abstract class Animal {
  abstract function locomover();
}

Dois exemplos de ocorrências de polimorfismo são as classes Mamífero e Ave, demonstradas abaixo. Ambas estendem a classe abstrata Animal e, por conta disso, precisam implementar o método locomover()

class Mamifero extends Animal{
  public function locomover(){
      echo 'Mamíferos correm';
  }
}


class Ave extends Animal{
  public function locomover(){
      echo 'Aves voam';
  }
}

O mesmo código em Java seria conforme mostrado nos códigos abaixo.

public abstract class Animal {
  public abstract void locomover();
}
public class Mamifero extends Animal{
  @Override
  public void locomover() {
      System.out.println("Mamíferos correm");
  }
}
public class Ave extends Animal{
  @Override
  public void locomover() {
      System.out.println("Aves voam");
  }  
}

Como foi citado, métodos em Java que sobrescrevem outros métodos de outras classes geralmente acompanham a anotação de @Override. Além disso, as implementações de classes em Java obrigatoriamente precisam ser feitas em classes distintas, sendo que essa obrigatoriedade não se aplica em PHP.

Com as comparações feitas entre as linguagens, analisando suas histórias, seus recursos e suas implementações do paradigma orientado a objetos, podemos perceber que ambas são linguagens completas e consolidadas. Embora cada uma possua áreas em que se destaca melhor, em termos de orientação a objetos, elas podem ser utilizadas para implementar situações do dia a dia, objetivo principal da orientação a objetos.

E aí, curtiu aprender mais sobre essas linguagens? Me diga o que você achou e vamos compartilhar conhecimento!

Compartilhe
Comentários (0)