PHP:'使用'在类定义中

时间:2014-09-27 08:58:12

标签: php oop namespaces multiple-inheritance

最近我遇到了一个在类定义中使用use语句的类。

有人可以解释它究竟做了什么 - 因为我找不到任何有关它的信息。

我理解它可能是一种从给定文件的全局范围移走它的方法,但是它也许允许给定的类继承多个父类 - 因为extends只允许一个父类课程参考?

我看到的例子是Laravel原始安装的User模型:

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

}

我已经看到这个模型的一些例子实际上使用了UserTrait类中包含的方法 - 因此我怀疑,但是我真的想了解更多关于所附use语句的含义的内容

PHP documentation说:

  

必须在文件的最外层范围内声明use关键字(   全局范围)或内部命名空间声明。这是因为   导入是在编译时完成的,而不是运行时,因此不能   块范围。以下示例将显示非法使用   使用关键字:

后面跟着例子:

namespace Languages;

class Greenlandic
{
    use Languages\Danish;

    ...
}

这表明它是use关键字的错误使用 - 任何线索?

1 个答案:

答案 0 :(得分:35)

它们被称为 Traits ,自 PHP 5.4 以来可用。它们使用 use 关键字导入到另一个类或命名空间中,该关键字包含在 PHP 5.0 之后,例如将常规类导入另一个类。它们是单一遗传。实现特征的主要原因是由于单一继承的限制。

有关详细信息,请参阅PHP trait manual