在PHP中使用vs包含

Rob*_*bin 6 php phpunit namespaces include

我正在努力弄清PHP名称空间并使用PHPUnit进行测试。

当我phpunit test.php在Windows的命令行中运行时,来自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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我注释掉时,由于没有引用所需的类/函数,因此use PHPUnit\Framework\TestCase;我觉得Class 'TestCase' not found这很有意义。

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

我在这里没有使用任何自动加载功能-只是solution.php文件和文件中的上述测试test.php

有人可以解释一下我在这里缺少什么吗?没有任何明确的PHPunit功能,测试如何进行?

我应该提到我已经通过Composer在全球安装了PHPUnit。

Jus*_*ons 6

使命名空间清晰(此处忽略类文件的加载)

所以在一个 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;
}
Run Code Online (Sandbox Code Playgroud)

命名空间是为了防止名称冲突!


Sha*_*yal 4

使用不包括任何东西。它只是将指定的命名空间(或类)导入到当前范围,您需要设置一个自动加载器才能包含定义命名空间的文件。在这里阅读有关自动加载的更多信息: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

?>
Run Code Online (Sandbox Code Playgroud)

  • *“将指定的命名空间导入到当前范围”* - 它甚至不这样做。它所做的只是建立一个*别名*,这是您可以在代码中使用的简写形式。而已。 (3认同)