如何使用php使用特征内的对象初始化属性?

时间:2019-04-14 12:59:50

标签: php traits

我设置的环境是将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
    }

}

2 个答案:

答案 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();
    }
}