为了进一步理解OOP,我决定使用抽象类重构一些代码。这个想法很粗略;
问题;
子类按预期扩展了抽象类,但是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
}
答案 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;
您会看到两个孩子的价值相同。