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

Dúvida sobre Herança

Tenho as seguintes classes em arquivos distintos:

("..." representa o restante do código não necessário para este post, tal como a definição do namespace e autoload)

Member.php:

...
class Member extends Account
{
    function __construct()
    {
        $this->money = 900;
    }
}

Account.php:

...
abstract class Account
{
    protected string $ownerName;
    protected string $money;
    private static int $accountNumber;

    public function __construct(string $ownerName)
    {
        $this->ownerName = $ownerName;
        self::$accountNumber += 1;
    }

    public function getOwnerName(): string
    {
        return $this->ownerName;
    }
...
}

main.php (arquivo a ser executado):

...
$novaConta = new Member("Diego Ribeiro");

var_dump($novaConta);

Ao debugar a variavel novaConta percebo que ownerName não foi inicializado. Pelo que entendi durante o curso uma classe filha tem todos os métodos e atributos da classe pai, porém ao instanciar uma nova classe com $novaConta = new Member("Diego Ribeiro"); eu esperava que "Diego Ribeiro" fosse atribuido a ownerName, passando primeiramente pelo construtor da classe pai.

Como eu poderia resolver isso? Uma alternativa seria receber o parametro no construtor de Member, porém isso acabaria me fazendo repetir o mesmo trecho de código para cada nova classe filha de Account.

3 respostas
solução!

Oi Vinícius,

Pelo que notei você não está chamando o construtor da classe Pai, por isso não está inicializando o atributo.

Tente fazer da seguinte forma:

class Member extends Account
{
   public function __construct(string $ownerName)
    {
        parent::__construct($ownerName);
        $this->money = 900;
    }
}

Ao refatorar dessa maneira diga se funcionou certinho. Bons estudos.

A resposta do Diego é perfeita e 100% correta. Só vou adicionar alguns detalhes conceituais aqui, xará.

O que você fez se chama sobrescrita de método. Na sua classe derivada (Member) você redefiniu o método construtor, logo, o método construtor da classe base (Account) não vai ser chamado. Em PHP, para que ambos os construtores coexistam, você precisa chamá-lo de forma explícita. Repara que no seu construtor da classe derivada você nem ao menos recebia o parâmetro do nome...

Em algumas outras linguagens o construtor da classe base é chamado automaticamente, então nesse caso o compilador te daria algumas dicas a mais para entender o problema. No PHP o funcionamento é como o Diego mostrou e eu expliquei por alto no parágrafo anterior.

Então basicamente, levando essas infos em consideração, a solução é a apontada pelo Diego, entendeu, xará?

Abraços e bons estudos.

Faz total sentido, eu havia tentado fazer da forma que o Diego mostrou, porém não passando os parâmetros para o construtor da classe base com o parent. Obrigado pela explicação e pelas dicas.