Методы родительских классов наследуются по ссылке или по значению - PullRequest
0 голосов
/ 07 ноября 2018

У меня вопрос, если у меня есть родительский класс с методом с именем 'speak', и он расширяет, скажем, 3 других дочерних класса, а затем я создаю 3 объекта из каждых 3 дочерних классов, и поэтому я получаю 9 объектов в памяти, тогда у меня будет 9 раз в памяти метод 'говорить' (для родительского класса) и я буду иметь определение "говорящего" для каждого объекта, или у меня будет только указатель на каждый объект для "говорящего" 'метода в родительском классе, и поэтому я буду иметь в памяти метод' говорящего 'только один раз (очевидно, в случае, если я не переопределю' говорящее 'в дочерних классах)

<?php

class Animal
{
    public $color;

    function __construct($color)
    {
        $this->color = $color;
    }

    public function speak ()
    {
        echo 'I am method 1 from '.$this->color.' animal <br><br>';
    }
}

class RedAnimal extends Animal
{
    function __construct()
    {
        parent::__construct('red');
    }
}

class GreenAnimal extends Animal
{
    function __construct()
    {
        parent::__construct('green');
    }
}

class YellowAnimal extends Animal
{
    function __construct()
    {
        parent::__construct('Yellow');
    }
}

$redAnimal = new RedAnimal();
$greenAnimal = new GreenAnimal();
$yellowAnimal = new YellowAnimal();

$redAnimal->speak();
$greenAnimal->speak();
$yellowAnimal->speak();

1 Ответ

0 голосов
/ 07 ноября 2018
  • Объект класса RedAnimal будет иметь все методы и свойства унаследованного класса Animal, которые не являются частными. php документация . Таким образом, в вашем примере в памяти будет только 3 объекта RedAnimal, GreenAnimal and YellowAnimal, и, поскольку вы создали 3 объекта для каждого, в памяти будет 9 объектов. Каждый из 9 объектов будет иметь собственный метод speak в отдельном адресном пространстве в памяти.
  • Однако, если вы объявите метод speak в родительском классе, т. Е. Animal, как static, он будет загружен в память только один раз и будет оставаться там до тех пор, пока на него не будет никаких ссылок. Все остальные объекты дочерних классов будут использовать тот же метод, который находится в памяти. Этот метод будет загружен только ОДИН РАЗ, будучи статичным.
  • Существуют типы памяти: куча, стек и т. Д. Я не сосредоточился на том, что находится в памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...