【问题标题】:Use vs Include in PHP在 PHP 中使用 vs 包含
【发布时间】:2017-08-25 15:54:35
【问题描述】:

我正在尝试了解 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。

【问题讨论】:

  • 没有Use vs Include in PHP,如果你想以正确的方式使用use,你必须使用autoloader来加载类。
  • use 用于在当前脚本中获取速记。这与包含无关。你也可以class myTests extends \PHPUnit\Framework\TestCase {
  • 您通过phpunit 运行该文件,它已经加载了所有相关的PHPUnit 文件。 use 没有加载文件,phpunit 加载了。
  • Can someone please explain what I'm missing here? @deceze 一针见血。通过phpunit 运行的脚本不像php 那样工作。

标签: php namespaces include phpunit


【解决方案1】:

为了明确命名空间(这里忽略类文件的加载)

所以在一个 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;
}

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

【讨论】:

    【解决方案2】:

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

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

    专业提示:打开你会更好理解的 phpunit 文件。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • “将指定的命名空间导入到当前作用域”——它甚至不这样做。它所做的只是建立一个alias,一个你可以在你的代码中使用的简写。仅此而已。
      【解决方案4】:

      use 通常可以用来缩短一个类名,当它被放在类定义的顶部时。但是当 use 出现在类定义中时,它意味着包含一个 Trait。 https://www.w3schools.com/php/php_oop_traits.asp

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2011-05-18
        • 1970-01-01
        • 2013-05-02
        • 2018-09-12
        相关资源
        最近更新 更多