我设置的环境是将MAMP与php版本7.2.14和PhpStorm一起使用。基于PHP: Trait - Manual
特征是单一继承语言中代码重用的机制...
我创建了一个ValidationHelper.php
特征以帮助验证表单数据。 Pear具有email($email_addr)
之类的验证功能,可以接受电子邮件地址进行验证。静态调用此类似乎不再理想,因此我尝试实例化它。如果尝试使用对象初始化属性,则PHP会引发错误,因此,我添加了一个构造函数以实例化该对象。 PHP: Trait - Manual还指出
无法单独实例化Trait。
单独是歧义的关键词。如此说来,您将如何添加一个初始化某些属性的构造函数,或使用特征实例化一个对象?
Can Traits have properties...Constructors是我读到的特征可以拥有这些成员的地方。我确实看到他们包括一个构造函数,但不是100%知道它是如何工作的。
include_once 'Pear/Validate.php';
trait ValidationHelper
{
protected $validate;
public function __constructor(){
$this->validate = new Validate();
}
public function validate_email($email){
return $this->validate->email($email); //$validate is null
}
}
答案 0 :(得分:1)
@凯文威金斯
好像有误会。 如Can Traits have properties...Constructors
的第一个答案中所述 <块引用>Traits 可以有构造函数和析构函数,但它们不是用于 trait 本身,而是用于使用 trait 的类。因此,我不建议这样做。
这意味着如果你在包含的 trait 中声明了一个构造函数/析构函数,这个函数就像在类本身中声明一样。因此,只有在 trait 中定义了添加到类中的唯一类变量时,这才会起作用。
特征本身根本无法实例化。它只是一组注入到类中的代码,因此其行为与在该类中编写的一样。
答案 1 :(得分:0)
与其尝试实例化特征中的对象,不如将其实例化到层次系统中。
include_once 'Pear/Validate.php';
class My_Object_Class
{
protected $validate;
public function __construct(){
$this->validate = new Validate();
}
}