Pular para o conteúdo principal

Questão de Programação — PHP — FGV 2024

ProgramaçãoPHP
Código
fg077402
Banca
FGV
Órgão
CVM
Ano
2024
Nível
Superior
Cargo
Analista - Perfil 8 - TI / Sistemas e Desenvolvimento - Tarde
Observe as seguintes classes, definidas na sintaxe do PHP.Imagem associada para resolução da questãoSe o objetivo de SaidaNegrito é imprimir o texto herdado de SaidaSimples na página, entre as etiquetas de formatação, o comentário #COMANDO deve ser substituído por:
  1. Aparent::render();
  2. B$super->render();
  3. CSaidaSimples->render();
  4. Dbase::render();
  5. E$inherited->render();
Revelar gabarito e comentário

GabaritoA — parent::render();

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Herança em PHP: o operador parent::

Gabarito: letra A. Para que SaidaNegrito imprima o texto herdado de SaidaSimples entre as etiquetas de formatação, o comentário #COMANDO deve ser substituído por parent::render();. Em PHP, a palavra-chave parent permite acessar métodos (e propriedades) da classe pai a partir de uma classe filha, e o operador de resolução de escopo :: é usado para chamar o método da classe pai — exatamente o que a alternativa A descreve.

A herança é um dos pilares da programação orientada a objetos. Quando uma classe SaidaNegrito estende SaidaSimples, ela herda todos os métodos públicos e protegidos da classe pai. Isso significa que, se SaidaSimples tem um método render(), a classe filha pode usá-lo diretamente, como se fosse seu. Porém, quando a classe filha redefine (sobrescreve) esse método — que é o caso típico aqui, já que SaidaNegrito quer adicionar as etiquetas de formatação —, a versão original da classe pai fica "escondida" pela nova versão. Para chamar a implementação original, o PHP oferece a palavra-chave parent.

A sintaxe parent::render() funciona assim: parent é uma referência especial que aponta para a classe pai da classe atual, e :: é o operador de resolução de escopo, que permite acessar métodos estáticos, constantes ou métodos da classe pai sem precisar de uma instância. No contexto de um método de instância, parent::render() invoca o método render() definido na classe pai, permitindo que a classe filha reutilize a lógica original e adicione algo em volta — no caso, as etiquetas de formatação.

Vamos a um exemplo concreto. Suponha que SaidaSimples tenha:

class SaidaSimples {
    public function render() {
        echo "texto";
    }
}

E SaidaNegrito estenda SaidaSimples:

class SaidaNegrito extends SaidaSimples {
    public function render() {
        echo "<b>";
        parent::render();  // chama SaidaSimples::render()
        echo "</b>";
    }
}

Ao chamar (new SaidaNegrito())->render(), a saída será <b>texto</b>. Sem o parent::, a classe filha entraria em recursão infinita (chamaria a si mesma), ou, se não sobrescrevesse o método, simplesmente herdaria o comportamento original sem as etiquetas.

A pegadinha desta questão está em confundir parent com outras formas de referência. parent é uma palavra-chave reservada do PHP, não uma variável — por isso $super->render() e $inherited->render() estão errados: $super e $inherited não são definidos em lugar nenhum, e mesmo que fossem, a sintaxe com -> é para chamar métodos de uma instância, não da classe pai. SaidaSimples->render() também está errado porque falta o operador :: (seria SaidaSimples::render()), e mesmo assim, usar o nome da classe diretamente não é a forma idiomática — parent:: é mais robusto, pois não exige saber o nome da classe pai. base::render() está errado porque base não é uma palavra-chave do PHP para herança; a palavra-chave correta é parent.

Guarde a distinção: parent:: é a forma correta de chamar um método da classe pai dentro de uma classe filha. É exatamente nesse ponto que as alternativas se dividem — as erradas usam variáveis inexistentes, sintaxe incorreta ou palavras-chave que não existem no PHP.

Alternativa A — ✅ Correta ⟵ GABARITO

parent::render(); é a sintaxe correta. A palavra-chave parent referencia a classe pai, e o operador :: (resolução de escopo) permite chamar o método render() da classe SaidaSimples. Isso executa a implementação original, permitindo que SaidaNegrito adicione as etiquetas de formatação ao redor.

Alternativa B — ❌ Incorreta

$super->render(); está errada porque $super não é uma variável definida no código. Em PHP, a referência à classe pai é feita pela palavra-chave parent, não por uma variável. Além disso, o operador -> é usado para chamar métodos de uma instância de objeto, não para acessar a classe pai.

Alternativa C — ❌ Incorreta

SaidaSimples->render(); está errada porque falta o operador de resolução de escopo ::. A sintaxe correta para chamar um método estático ou da classe pai seria SaidaSimples::render(). Além disso, usar o nome da classe diretamente não é a forma idiomática dentro de uma classe filha — parent:: é mais adequado e não depende do nome da classe pai.

Alternativa D — ❌ Incorreta

base::render(); está errada porque base não é uma palavra-chave do PHP para herança. A palavra-chave correta é parent. O PHP não reconhece base como referência à classe pai, então o código geraria um erro fatal.

Alternativa E — ❌ Incorreta

$inherited->render(); está errada pela mesma razão da alternativa B: $inherited não é uma variável definida. A referência à classe pai é feita com parent, não com uma variável. O operador -> também não é apropriado para acessar a classe pai.

Gabarito: letra A

Link permanente: /questoes/fg077402