父类方法是按引用或值继承的

时间:2018-11-07 15:43:09

标签: php class oop inheritance methods

我的问题是,如果我有一个名为“ 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();

1 个答案:

答案 0 :(得分:1)

  • RedAnimal的对象将具有继承的类Animal的所有非私有方法和属性。 php documentation。因此,在您的示例中,内存中只有RedAnimal, GreenAnimal and YellowAnimal的3个对象,并且您实例化了每个对象的3个对象时,内存中将有9个对象。 9个对象中的每一个将在内存的单独地址空间中拥有自己的speak方法。
  • 但是,如果您在父类(例如Animal)中声明speak方法为static,则该方法仅会在内存中加载一次,并保持在那里直到对它有任何引用。子类的所有其他对象将使用内存中的相同方法。仅当静态时才加载此方法。
  • 有多种类型的内存,例如堆,堆栈等。我没有关注内存中的变化。