我的问题是,如果我有一个名为“ speak”的父类,并且它扩展了其他3个子类,然后我从3个子类中实例化了3个对象,那么我最终得到9个对象在内存中,那么我将在内存中有9次称为“ speak”的方法(在父类上),并在每个对象上都有“ speak” -s的定义,或者在每个对象上只有一个指向“ speak”的指针'方法在父类上,因此我将在内存中只使用一次'speak'方法(很明显,如果我不重写子类中的'speak'方法)
<?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 :(得分:1)
RedAnimal
的对象将具有继承的类Animal
的所有非私有方法和属性。 php documentation。因此,在您的示例中,内存中只有RedAnimal, GreenAnimal and YellowAnimal
的3个对象,并且您实例化了每个对象的3个对象时,内存中将有9个对象。 9个对象中的每一个将在内存的单独地址空间中拥有自己的speak
方法。 speak
方法为static
,则该方法仅会在内存中加载一次,并保持在那里直到对它有任何引用。子类的所有其他对象将使用内存中的相同方法。仅当静态时才加载此方法。