【问题标题】:Inherit properties from parent class without calling the parent method again in PHP从父类继承属性而不在 PHP 中再次调用父方法
【发布时间】:2021-04-15 17:36:22
【问题描述】:
class A
{
    public $variable

    public function someFunction()
    {
        $this->variable = 'I am a variable';
    }
}

class B extends A
{
    public function anotherFunction()
    {
        parent::someFunction();

        $stmt = $this->dbc->prepare('INSERT INTO table(row) VALUES(:variable)');
        $stmt->bindParam(':variable', $this->variable);
        $stmt->execute();
        $stmt = null;
        $dbc = null;
    }
}

如何在不再次调用 someFunction() 的情况下从“A 类”继承 $variable

我遇到的问题是我的“A 类”将产品添加到购物篮中,而“B 类”将它们插入到数据库中。当我在“B 类”中调用someFunction() 以获取存储在“A 类”属性中的所有产品详细信息时,它再次将产品添加到购物篮中,因为该方法被调用了两次,一次在“A 类”中,然后再次在“A 类”中'B级'。

我可以将所有代码保留在一个类中,但这会违反 SRP 原则,不是吗?

编辑:上面的代码只是为了描述我的问题,它不是我真实脚本的精确表示,因此它与将产品添加到购物篮没有任何关系。我只是想让事情变得简单。

【问题讨论】:

  • 我删除了parent::someFunction(); 并且它可以工作,现在看起来很合乎逻辑,因为这段代码再次调用了该函数。我虽然有必要访问存储在该方法中的属性。

标签: php oop inheritance


【解决方案1】:

您的class Aclass B 是两个完全不同的实例。如果您有class A 的实例,那么您在其中所做的任何事情都不会反映在您的class B 实例中。

扩展时,将其视为class B 是一个不同的类,它只使用class A 作为基本模板。

您可以将class A 实例传递给class B 实例,而不是扩展它,以便class B 可以直接从class A-instance 获取它的数据。

例子:

class A
{
    public $var;

    public function doStuff()
    {
        $this->var = 'Foobar';
    }
}

class B
{
    public function doOtherStuff(A $classA)
    {
        // Now you can get the data from class a
        $var = $classA->var;

        // Do you db stuff
    }
}

$classA = new A();
$classA->doStuff();

$classB = new B();
$classB->doOtherStuff($classA);

【讨论】:

  • 非常感谢!两种方式都有效,但我只是一个菜鸟,如果使用一种或另一种方式有什么好处,我就在徘徊。
  • @yendrrek - 您当前的设置要求您保持两个对象同步。如果您在 A 类中执行 B 类需要的任何操作(例如添加值),您也需要在 B 类中手动执行此操作。因此,它在某些情况下似乎有效,但它并不像您认为的那样有效(根据您的问题)。
  • 应该是$var = $classA->var;(小错字,我相信 OP 明白了)。
  • @Jeto - 该死。谢谢!已更新。
  • @yendrrek 如果要将其设置为类属性,则应考虑使用构造函数注入(如通过类构造函数完成的依赖注入)。有关基本示例,请参阅 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2020-10-29
  • 1970-01-01
相关资源
最近更新 更多