Методы родительских классов наследуются по ссылке или по значению

У меня такой вопрос: если у меня есть родительский класс с методом с именем ‘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();

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector