【问题标题】:Parent classes methods are inherited by reference or by value父类方法通过引用或值继承
【发布时间】:2019-04-11 01:58:02
【问题描述】:

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

【问题讨论】:

  • 内存中的“对象”只是保持该对象状态所需的数据。提供类功能的代码是完全独立的。
  • 对不起,我不明白,所以你是说属性将被加载到内存中,并且将为每个类加载道具,但它们会从一个地方引用它们的方法?

标签: php class oop inheritance methods


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

【讨论】:

  • Kamran 您有关于此的文章或任何参考资料吗?谢谢
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多