在PHP的类主体中,use <classname>;`语法是什么意思?

时间:2018-08-09 19:07:51

标签: php

在PHPUnit文档中,我遇到了一些我不熟悉的PHP语法。

https://phpunit.readthedocs.io/en/7.3/database.html#asserting-the-result-of-a-query

<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\DbUnit\TestCaseTrait;

class ComplexQueryTest extends TestCase
{
    use TestCaseTrait;

    public function testComplexQuery()
    {
        $queryTable = $this->getConnection()->createQueryTable(
            'myComplexQuery', 'SELECT complexQuery...'
        );
        $expectedTable = $this->createFlatXmlDataSet("complexQueryAssertion.xml")
                              ->getTable("myComplexQuery");
        $this->assertTablesEqual($expectedTable, $queryTable);
    }
}

use TestCaseTrait;是我不明白的那一行。我知道顶部的use代用名称允许使用类而不使用完整的名称空间,但是我不知道它在这里做什么。在PHP中搜索use会得到有关该功能的结果。

2 个答案:

答案 0 :(得分:1)

易于解释(不是主要内容,而是示例): 它用于变量和方法,您必须反复编写。没有复杂的逻辑!

特质:

trait Name {
    protected $name;

    getName() {
         return $this->name;
    }

    setName($name) {
         $this->name = $name;
    }
}

class test {
    use Name;

    /* In background it looks like that (without comment ;) */
    //protected $name;

    //getName() {
    //     return $this->name;
    //}

    //setName($name) {
    //     $this->name = $name;
    //}
}

10个其他需要这些变量和方法的类,可以使用它们。

在此测试案例中,大多数情况下您需要使用相同的方法,这就是为什么它们只是这样包含它们的原因。

答案 1 :(得分:0)

将其保留在php.net上的注释中以进行澄清。以下注释使我想到了此功能的术语“特征”。 (我应该猜出这个名字是正确的。)https://secure.php.net/manual/en/language.namespaces.importing.php#119919

引用手册:

  

从PHP 5.4.0开始,PHP实现了一种称为Traits的代码重用方法。

     

特质是一种在单一继承语言中重用代码的机制   例如PHP。性状旨在减少单身的某些限制   通过使开发人员能够在内部自由重用方法集来继承   几个独立的班级生活在不同的班级层次结构中。的   特性和类组合的语义是通过以下方式定义的   这降低了复杂性,并避免了相关的典型问题   具有多个继承和Mixins。

     

一项特质类似于一个班级,但仅用于分组   细致且一致的功能。这不可能   自己实例化特质。它是传统的补充   继承并实现行为的横向组合;那是,   类成员的应用而无需继承。

     

https://secure.php.net/manual/en/language.oop5.traits.php

我从没听说过这个功能,很有趣。