Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como definir atributos da classe mãe ao criar um objeto a partir da classe filha?

Segue o código da classe mãe e classe filha (respectivamente):

*Classe mãe: *

class Pessoa extends Endereco{

//Atributos
protected $cpf;
protected $nome;
protected $idade;
protected $sexo;

//MÉTODOS

//Construtor
public function __construct($cpf, $nome, $idade, $sexo){
    $this->cpf = $cpf;
    $this->validaCPF();
    $this->nome = $nome;
    $this->validaNome();
    $this->idade = $idade;
    $this->validaIdade();
    $this->sexo = $sexo;

    //Ao passar por todas as validações
    echo "Cadastro Efetuado com sucesso!!!";
    //Chama funão que informa tudo sobre essa pessoa
    $this->mostrarInfo();
}

//Recupera Nome
public function getNome(){
    return $this->nome;
}

//Recupera Idade
public function getIdade(){
    return $this->idade;
}

//Recupera Sexo
public function getSexo(){
    return $this->sexo;
}

//Valida CPF da pessoa
public function validaCPF(){
    if(strlen($this->cpf) < 14){
        echo "Número do CPF está incompleto";
        exit();
    }
    else if(strlen($this->cpf) >= 15){
        echo "Números demais no CPF informado.";
        exit();
    }
}

//Validar Nome da Pessoa
public function validaNome(){
    if(strlen($this->nome) <= 4){
        echo "Nome incompleto ou curto demais. Informe o nome completo;";
        exit();
    }
}

//Valida Idade
public function validaIdade(){
    if($this->idade < 3){
        echo "Não é possivel cadastras pessoas com menos de 3 (três anos).";
        exit();
    }
    else if($this->idade > 120){
        echo "Tem certeza que esta pessoa tem <b>$this->idade</b>?";
        exit;
    }
}

//Mostrar Informações
public function mostrarInfo(){
    echo "<br>";
    echo "Olá! Este é o: $this->nome, $this->sexo. Ele tem $this->idade, inscrito(a) no CPF sob o número $this->cpf.";
}

//Recupera cidade
public function recuperaCidade(){
    return $this->Endereco->getCidade();
}

}

Classe filha:

<?php

require_once 'Pessoa.php';
require_once 'Endereco.php';

class aluno extends Pessoa{

    //Atributos
    private $codMatricula;
    private $escola;

    //
    public function __construct($codMatricula, $escola){

        parent:: __construct($cpf, $nome, $idade, $sexo);

        $this->codMatricula = $codMatricula;
        $this->escola = $escola;

        $this->cpf = $cpf;
        $this->nome = $nome;
        $this->idade = $idade;
        $this->sexo = $sexo;

        echo "Aluno cadastrado com sucesso!";

    }

    //Set Codigo da matricula
    public function setCodMatricula($codMatricula){
        $this->codMatricula = $codMatricula;
    }

    //GET codsig matricula
    public function getCodMatricula(){
        return $this->codMatricula;
    }

}

A minha duvida é a seguinte: ao criar um objeto Aluno eu sei onde devo informar o codMatricula e escola, mas não sei onde devo informar os atributos da classe mãe (Pessoa)? Segue o código abaixo:

<?php
//require_once 'Pessoa.php';
require_once 'Endereco.php';
require_once 'Aluno.php';

$aluno1 = new Aluno("01451115", "Cosme Alves Barbosa");

var_dump($aluno1);

Ao criar o objeto $aluno1 surge a seguinte mensagem de erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

Olá, Welton.

Ao instanciar um aluno, o construtor da classe aluno será chamado, e esse construtor deve chamar o construtor da classe base (Pessoa).

Sendo assim, todos os parâmetros necessários tanto para aluno quanto para Pessoa devem ser recebidos no construtor da classe aluno. Ficaria algo como:

public function __construct($cpf, $nome, $idade, $sexo, $codMatricula, $escola)
{
    parent:: __construct($cpf, $nome, $idade, $sexo);
    // ...
} 

Resolvido esse problema, seu código tem alguns outros pontos que estão incorretos.

  1. Repare no seguinte código:

    class Pessoa extends Endereco

    Essa linha está dizendo que "uma pessoa é um endereço". Isso não faz sentido. Ao invés de estender Endereco, a classe pessoa deve ter um atributo do tipo Endereco.

  2. Você tem classes começando com letra maiúscula (Pessoa e Endereco) e classes começando com letra minúscula (aluno). Você precisa padronizar isso. O ideal é seguir as recomendações desse documento

Conforme você for avançando nos estudos e fazendo os demais cursos, as coisas vão ficar mais claras. Mas aparentemente você pulou uma boa etapa da formação de PHP, né!?

Sugiro dar uma olhada também neste guia

Vinicius, te admiro demais, cara!!! Tu é f*da!!!!! Deu certo! OBRIGADO!!