Jump to content
  • 0
Babi182

[DÚVIDA] - Polimorfismo em PHP

Question

Boa noite, colegas.

Sou nova por aqui.

Estou recorrendo ao fórum pois tenho duas questões da faculdade em que eu e um colega estamos divergindo nas respostas. Se possível, gostaria da opinião de vocês sobre o assunto. 

 

1) Por princípio, objetos polimorfos são objetos semelhantes que atuam de forma diferente. Para implementar tal princípio, é necessário usar uma referência a um objeto do tipo da superclasse (ponteiro ou endereço) e, a partir daí, o sistema pode decidir sobre qual método deve ser selecionado na execução do objeto, de acordo com o tipo da classe derivada, durante a execução. Qual o principal recurso do PHP orientado a objetos utilizamos para implementar polimorfismo?

Interface nomeDaClasse

implements nomeDaClasse --> colega ficou com esta

public, protected e private

abstract class nomeDaClasse --> fiquei com esta resposta

NomeDaClasse::metodo

 

2)A orientação a objetos no PHP permite a criação de classes com diversos recursos, como interfaces, implementações, abstrações e visibilidade. Um objeto passa a ser considerado objeto após ser instanciado em uma variável no PHP, com a utilização da sintaxe: $variável = new Classe(); por exemplo, ($carro = new Carro();). Porém, no PHP, é possível realizar uma chamada estática para um método ou propriedade de um objeto sem instanciá-lo. Qual das opções abaixo representa um exemplo de chamada estática do PHP para um método ou propriedade?

 $carro->propriedade;

 $carro->metodo();   --> fiquei com esta resposta

carro->propriedade;

Carro::propriedade; --> o colega com esta

carro->metodo();

 

Sobre esta questão 2, encontramos no manual o seguinte:

 

Exemplo #1 Exemplo de método estático

<?php
class Foo {
    public static function 
aStaticMethod() {
        
// ...
    
}
}


Foo::aStaticMethod();
$classname 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>
 

Exemplo #2 Exemplo de propriedade estática

<?php
class Foo
{
    public static 
$meu_estatico 'foo';

    public function 
valorEstatico() {
        return 
self::$meu_estatico;
    }
}

class 
Bar extends Foo
{
    public function 
fooEstatico() {
        return 
parent::$meu_estatico;
    }
}


print 
Foo::$meu_estatico "\n";

$foo = new Foo();
print 
$foo->valorEstatico() . "\n";
print 
$foo->$meu_estatico "\n";      // "Propriedade" Indefinida $meu_estatico

print $foo::$meu_estatico "\n";
$classname 'Foo';
print 
$classname::$meu_estatico "\n"// No PHP 5.3.0

print Bar::$meu_estatico "\n";
$bar = new Bar();
print 
$bar->fooEstatico() . "\n";
?>

 

Galera imagino que devam ser questões tranquilas, ainda mais com o pouco q vi nos tópicos, mas somos novos com a linguagem.

 

Desde já agradeço a atenção e  disponibilidade dos colegas.

Vlw!

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Opa, bom dia.

 

Não sou especialista pois nunca fiz curso nisso, mas:

 

1)

O polimorfismo é o conceito de manter os tipos de dados iguais em classes abstratas e nas classes que vão sobrepor essa abstração.

Por exemplo:

<?
class Numero
{
    abstract public function numero();
}
<?php
class NumeroInt extends Numero
{
    public function numero()
    {
        echo "1";
    }
}

No caso, o método numero() da classe NumeroInt() sobrepôs o método abstrato numero() da classe Numero(), pelo que eu entendo isso é a polimorfia.

Por não se tratar de um classe estática, no meu exemplo pelo menos, acredito que a resposta do seu amigo seja a correta.

 

2)

Essa acho que é um pouco mais simples, um método estático pode ser instanciado, mas um método não estático, não pode ser chamado de forma estática, dito pelo próprio manual do PHP, o mesmo devolve um erro caso tente.

 

Sendo assim, um método estático seria algo como isso:

<?php
class Numeros
{	
  	public static function numeroUm()
	{
		echo "1";
	}
}
	

E a chamada:

<?php
Numeros::numeroUm();	

 

No caso da segunda, também acredito que a resposta do seu colega seja a correta.

 

Acho que é isso, mas não posso dizer com toda certeza se é, e se alguém responder algo diferente e eu estiver errado vai ser muito bom pois aplico isso ao meu trabalho e posso estar fazendo alguma coisa muito errada kkk.

Share this post


Link to post
Share on other sites
  • 0

1) A primeira questão está com a definição errada. O conceito básico de polimorfismo é de que objetos diferentes possam trabalhar de maneira homogênia. O correto é a interface. Entretanto, uma classe abstrata é uma classe especial sendo uma "mescla" entre uma classe que não pode ser instanciada e uma interface. Entretanto, a interface tem como exclusividade garantir um tratamento homogênio de classe distintas. Tanto que todos os métodos de uma interface devem ser abstratos e públicos.

 

2) Classe::metodo(); ou Classe::propriedade. Ambos utilizam o operador de resolução de escopo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Samuel Pietro
      Tenho um select em PDO e preciso que a consulta retornada vire uma variavel, mas a variavel só pega a ultima linha da tabela e eu preciso que pegue todas as linhas que existirem.
       
      $conexao = conexao::getInstance(); $sql = 'SELECT * FROM RegistroE'; $stm = $conexao->prepare($sql); $stm->execute(); $Sql = $stm->fetchAll(PDO::FETCH_OBJ); foreach ($Sql as $SqlReg): $conteudo_meio = picture_X($SqlReg->E_01,1) .picture_X($SqlReg->E_02,25) .picture_9($SqlReg->E_03,4) .picture_X($SqlReg->E_04,14) .picture_9($SqlReg->E_05,8) .picture_9($SqlReg->E_06,8) .picture_9($SqlReg->E_07,8) .picture_9($SqlReg->E_08,8) .picture_9($SqlReg->E_09,8) .complementoRegistro(96,"brancos") .picture_9($SqlReg->E_11,1) .complementoRegistro(1,"brancos") ; endforeach; Como eu poderia está fazendo isto?
    • By peterstefan
      Bom dia, estou fazendo uma cadastro via rest e estou utilizando o curl para cadastrar no webservice...
      Meu código está cadastrando tudo certinho, porem quando ele cadastra e mostra o retorno que foi cadastrado com sucesso ele fica o AGUARDE, CARREGANDO e não para.. não sei oque esta faltando pq já tentei varias coisas e não deu certo... 
       
       
       
      $Data = [ "nomeRazaoSocial" => $PostData['nomeRazaoSocial'], "identMF" => $PostData['identMF'], "email" => $PostData['email'], "telefone" => $PostData['telefone'], "senhaProvisoria" => $PostData['senhaProvisoria'] ]; $DataString = json_encode($Data); $curl = curl_init(WEBSERVICECADASTRO); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_POSTFIELDS, $DataString); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($DataString)) ); $result = curl_exec($curl); if ($result) { $jSON['success'] = "<i class='icon-checkmark'></i>Pronto, cadastro foi realizado com sucesso!"; }else{ $jSON['error'] = "<i class='icon-warning'></i>Oops! Erro ao cadastrar! Por favor, tente novamente!"; }  

       

    • By RSN
      Boa Noite,
      Preciso enviar uma consulta sql no corpo do e-mail, porém não estou conseguindo concatenar o laço while.
      <?php include_once('conexao.php'); require 'PHPMailer/PHPMailerAutoload.php'; $resultado = mysql_query("SELECT * FROM cupom WHERE FlagEstorno = 1;"); $linhas = mysql_num_rows($resultado); $mensagem = '<div class="x_content"> <table id="datatable-buttons" class="table table-striped table-bordered"> <thead> <tr> <th>Loja</th> <th>Nro Cupom</th> <th>Data</th> <th>Operador</th> </tr> </thead> <tbody> while($linhas = mysql_fetch_array( $resultado)){ echo " <tr>"; echo "<td>".$linhas['nroloja']."</td>"; echo "<td>".$linhas['NroCupom']."</td>"; echo "<td>".$linhas['DataProc']."</td>"; echo "<td>".$linhas['Operador']."</td>"; echo " </tr>"; }'; $mail = new PHPMailer(); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->Username = ''; $mail->Password = ''; $mail->Port = 587; $mail->setFrom(''); $mail->addReplyTo(''); $mail->addAddress('', 'Nome'); $mail->isHTML(true); $mail->Subject = 'Assunto do email'; $mail->Body = $mensagem; $mail->AltBody = 'Para visualizar essa mensagem acesse http://site.com.br/mail'; //$mail->addAttachment('/tmp/image.jpg', 'nome.jpg'); if(!$mail->send()) { echo 'Não foi possível enviar a mensagem.<br>'; echo 'Erro: ' . $mail->ErrorInfo; } else { echo 'Mensagem enviada.'; } ?>  
    • By Augustomesquita
      Bom dia pessoal!
      Vocês também estão programando em primeira pessoa? Recentemente escrevi este artigo e gostaria de compartilhar a ideia com vocês.
      Pare de programar em primeira pessoa!
    • By Matheus Guto
      Eae pessoal, bom sou novo no ramo e quero uma ajudinha em um erro de um programa para médias
      Parse error: syntax error, unexpected 'endif' (T_ENDIF) in C:\xampp\htdocs\atividade2.php on line 32
      ah, e tá aqui o código
       
      <html>
          <head>
              <title>Médias</title>
          <meta charset="UTF-8">
          </head>
      <body>
          <div>
              <form method="get">
                  Primeira nota:<input type="text" name="nota1"/> <br>
                  Segunda nota:<input type="number" name="nota2"/> <br>
                  Terceira Nota:<input type="number" name="nota3"/>
                  <input type="submit" name="botao" value="clique"/>
              </form>
          <?php
              if (isset($_GET["botao"])) {
                  $nota1 = isset($_GET["nota1"])?$_GET["nota1"]:"";
                  $nota2 = isset($_GET["nota2"])?$_GET["nota2"]:"";
                  $nota3 = isset($_GET["nota3"])?$_GET["nota3"]:"";
              if ($nota1 == ""|| $nota3 =="" || $nota3 ==""){
                  echo "por favor digite todas as notas";
              } else {
                  $media = ($nota1+$nota2+$nota3)/3;
              echo "a média do aluno é" . $media . "<br>";
              }  if ($media >= 7)
              echo "aprovado";
                  elseif (($media < 7) && ($media >= 5))
                  echo "recuperação";
              else{
                  echo "reprovado";
              }
          endif
      endif
      ?>
          </div>
      </body>
      </html>
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.