PHP将对象的实例传递给抽象类构造函数

时间:2014-10-11 15:48:49

标签: php class dependency-injection abstract-class abstract

为了进一步理解OOP,我决定使用抽象类重构一些代码。这个想法很粗略;

  • 一个“父”抽象类,它构成了所有子类'扩展的基础。
  • 一个“助手”类,它有一系列抽象类的子项需要的方法。
  • “helper”类将被其他类使用,所以我不希望它成为抽象类的组成部分。

问题;

子类按预期扩展了抽象类,但是PHP给了我一个警告,即抽象类的构造函数中缺少$helper参数。我相信构造函数是被调用的,因为我的子类中没有一个,这很好,但是由于你没有直接调用抽象类,我该如何使它工作?以下示例代码;

abstract class Parent_Abstract
{
    public $input_helper_methods;

    public function __construct( $helpers = NULL )
    {

        //set the helper methods
        $this->input_helper_methods = $helpers;

    }
}

变量$helpers目前在另一个文件中,它包含在带有抽象类的文件顶部。同样,我认为这是如何做到这一点的问题。当我理解结构时我想使用自动加载器,但是现在,只需手动就可以了。这是该文件的内容;

class RD_Form_Input_Helper_Methods
{
    private $var = 'something';
}

$helpers = new RD_Form_Input_Helper_Methods;

我希望这有一定道理。感谢您抽出宝贵时间阅读/回复。

另一个例子;

//"helper" classes. I would like these methods to be available to Child_One and Child_Two
class Helper_Functions {}

class Formatting_Functions {}


abstract class Parent_Abstract()
{
    private $helper_functions;
    private $formatting_functions;

    public function __construct( $object_one, object_two )
    {
        $this->helper_functions = $object_one;
        $this->helper_functions = $object_two;
    }

}

class Child_One extends Parent_Abstract 
{
    //I can use any of the properties or methods from the Helper_Functions or Formatting_Function class
}

class Child_Two extends Parent_Abstract 
{
    //I can use any of the properties or methods from the Helper_Functions or Formatting_Function class
}

2 个答案:

答案 0 :(得分:2)

  

子类按预期扩展了抽象类,但PHP给了我一个警告,即抽象类的构造函数中缺少$helper参数。

如果抽象类构造函数需要$helper参数,则只会收到此类警告。但是您的代码不同,$helper参数是可选的:

abstract class Parent_Abstract
{
    public $input_helper_methods;

    public function __construct( $helpers = NULL )
    {                            ###############      $helpers is optional

现在我引用它,它也有一个不同的名称$helper = / = $helpers

因此,您在问题中提供的代码示例很可能是不完整且有错误的。

让我们概述一个以你的问题为蓝本的新模型:

abstract class AbstractBaseClass
{
    private $helper;

    function __construct($helper)
    {
        $this->helper = $helper;
    }
}

class Concrete extends AbstractBaseClass
{
}

简短的区别:$helper字段(或属性)是私有而不是 public ; <{1}} ctor参数是必需的。

使用该代码并实例化具体的子类会给出您所说的错误:

$helper

那是因为缺少帮手。为了使这个变得非常简单,让我们假设帮助器实际上是一个秘密数字,你需要在复杂的计算中完成所有这些具体的类。该号码为// Warning: Missing argument 1 for AbstractBaseClass::__construct() $obj = new Concrete();

42

现在错误消失了。 $obj = new Concrete(42); 字段已正确初始化:

helper

如您所见,已设置抽象类的 private 字段。帮助者(这里是数字42)已经分配给它。

答案 1 :(得分:-1)

您正在寻找的是static variables

在此示例中,我使用名为$text的变量而不是原始$helpers。一旦设置,变量在所有子类中都是相同的。

使用public static变量定义抽象类。此外,可选择定义getter function,这将允许您将静态变量的值作为每个子类的属性进行访问。

abstract class Parent_Abstract
{

    public static $text;

    public function __get($name)
    {
        // return the static variable's value
        return $name == 'text' ? self::$text : null;
    }
}

定义2个子类:

class Child1 extends Parent_Abstract
{

}

class Child2 extends Parent_Abstract
{

}

现在测试...设置静态变量的值,然后实例化子类并检查每个对象上$text的值;

Parent_Abstract::$text = 'hello world';

$child1 = new Child1();
$child2 = new Child2();

echo $child1->text . "\n";
echo $child2->text;

您会看到两个孩子的价值相同。