У меня такой вопрос: если у меня есть родительский класс с методом с именем ‘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();
RedAnimal
будет иметь все методы и свойства унаследованного класса Animal
которые не являются частными. PHP документация. Так что в вашем примере будет только 3 объекта RedAnimal, GreenAnimal and YellowAnimal
в памяти, и поскольку вы создали 3 объекта для каждого, в памяти будет 9 объектов. Каждый из 9 объектов будет иметь свои speak
метод в отдельном адресном пространстве в памяти. speak
метод в родительском классе, т.е. static
он будет загружен в память только один раз и будет оставаться там до тех пор, пока на него не будут ссылки. Все остальные объекты дочерних классов будут использовать тот же метод, который находится в памяти. Этот метод будет загружен только ОДИН РАЗ, будучи статичным.Других решений пока нет …