在PHP中使用vs Include

时间:2017-03-31 11:31:02

标签: php namespaces include phpunit

我正试图了解PHP命名空间并使用PHPUnit进行测试。

当我在Windows上的命令行中运行phpunit test.php时,来自Codewars的这些测试通过:

<?php
require 'solution.php';
use PHPUnit\Framework\TestCase;

class myTests extends TestCase {
  public function testExamples() {
        $this->assertEquals(pair_sum([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6);
        $this->assertEquals(pair_sum([1,2,3,1],3),1);
        $this->assertEquals(pair_sum([1,3,2,2],4),2);
        $this->assertEquals(pair_sum([1],4),false);
        $this->assertEquals(pair_sum([2,3,10,-5],5),2);
  }
}

然而,当我评论use PHPUnit\Framework\TestCase;时,我得到Class 'TestCase' not found这是有道理的,因为没有对所需类/函数的引用。

令我感到困惑的是,关于命名空间的大量答案声称use关键字不能替代include/require并且仍然需要包含/自动加载类(?)

我这里没有使用任何自动加载 - 只是一个solution.php文件以及test.php文件中的上述测试。

有人可以解释我在这里缺少的东西吗?如果没有明确包含PHPunit功能,测试如何工作?

我应该提一下,我通过Composer全局安装了PHPUnit。

4 个答案:

答案 0 :(得分:3)

清除名称空间(忽略此处加载类文件)

所以在一个php文件中:

namespace xyz {
  class a {}
  class b {}
}
namespace abc {
  use xyz\a;
  new a();
  new \xyz\b();
  class b extends a {}
}
namespace {
 use abc\b as aa;
 use xyz\b as bb;
 new bb;
 new aa;
}

命名空间用于防止名称冲突!

答案 1 :(得分:2)

就像@deceze所说的那样,PHPUnit为你完成了这项工作,但并不认为使用不需要包含该文件。

注意结构: https://phpunit.de/manual/current/en/database.html#database.tip-use-your-own-abstract-database-testcase

PRO-TIP:打开您更了解的phpunit文件。

答案 2 :(得分:1)

使用不包含任何内容。它只是将指定的命名空间(或类)导入当前范围,您需要设置自动装载器以包含定义命名空间的文件。 在此处阅读有关自动加载的详情:http://php.net/manual/en/language.oop5.autoload.php

include语句包含并评估指定的文件。

示例:

<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

答案 3 :(得分:1)

当将

use 放在类定义的顶部时,通常可以用来缩短其名称。但是,当 use 出现在类定义中时,就意味着要包含一个Trait。 MongoDB Atlas