Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从父类继承属性,而无需再次调用父方法_Php_Oop_Inheritance - Fatal编程技术网

在PHP中从父类继承属性,而无需再次调用父方法

在PHP中从父类继承属性,而无需再次调用父方法,php,oop,inheritance,Php,Oop,Inheritance,如何从“class A”继承$variable,而不再次调用someFunction() 我的问题是,我的“A类”将产品添加到篮子中,“B类”将它们插入数据库中。当我调用'class B'中的someFunction()以获取存储在'class A'属性中的所有产品详细信息时,它会再次将产品添加到篮子中,因为该方法被调用了两次,一次在'class A'中,另一次在'class B'中 我可以把所有代码都保存在一个类中,但这会打破SRP原则,不是吗 编辑:上面的代码只是描述我的问题,它不是我真实脚

如何从“class A”继承
$variable
,而不再次调用
someFunction()

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

我可以把所有代码都保存在一个类中,但这会打破SRP原则,不是吗


编辑:上面的代码只是描述我的问题,它不是我真实脚本的精确表示,因此它与向篮子中添加产品无关。我只是想让事情简单些。

你的
A类
B类
是两个完全不同的例子。如果您有一个
类别A
的实例,您在该类别中所做的任何事情都不会反映在
类别B
实例中

扩展时,请将其视为
类B
是一个仅使用
类a
作为基础模板的不同类

您可以将
class A
实例传递到
class B
实例,而不是扩展它,这样
class B
就可以直接从
class A
-实例获取它的数据

例如:

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;
    }
}

您的
A类
B类
是两个完全不同的实例。如果您有一个
类别A
的实例,您在该类别中所做的任何事情都不会反映在
类别B
实例中

扩展时,请将其视为
类B
是一个仅使用
类a
作为基础模板的不同类

您可以将
class A
实例传递到
class B
实例,而不是扩展它,这样
class B
就可以直接从
class A
-实例获取它的数据

例如:

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;
    }
}

我删除了
parent::someFunction()并且它可以工作,现在看起来很合乎逻辑,因为这段代码恰好再次调用了函数。我认为有必要访问该方法中存储的属性并且它可以工作,现在看起来很合乎逻辑,因为这段代码恰好再次调用了函数。我认为有必要访问该方法中存储的属性。非常感谢!这两种方法都有效,但我只是一个傻瓜,一直在犹豫使用这种或那种方法是否有任何好处。@yendrrek-您当前的设置要求您保持两个对象同步。如果您在类A中执行类B需要的任何操作(如添加值),那么您也需要在类B中手动执行。因此,它在某些情况下似乎是有效的,但它并没有按照您的想法(基于您的问题)工作(轻微的打字错误,我相信OP一定有这个想法)。@Jeto-Darn。谢谢如果您要将其设置为类属性,则应该考虑使用构造函数注入(如通过类构造函数完成的依赖注入)。有关基本示例,请参见。非常感谢!这两种方法都有效,但我只是一个傻瓜,一直在犹豫使用这种或那种方法是否有任何好处。@yendrrek-您当前的设置要求您保持两个对象同步。如果您在类A中执行类B需要的任何操作(如添加值),那么您也需要在类B中手动执行。因此,它在某些情况下似乎是有效的,但它并没有按照您的想法(基于您的问题)工作(轻微的打字错误,我相信OP一定有这个想法)。@Jeto-Darn。谢谢如果您要将其设置为类属性,则应该考虑使用构造函数注入(如通过类构造函数完成的依赖注入)。有关基本示例,请参见。