web-dev-qa-db-ja.com

使用vs含めるPHP

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が返されます。これは、必要なクラス/関数への参照がないため、意味があります。

しかし、私を混乱させているのは、名前空間に関するSO)の多くの回答が、useキーワードはinclude/requireの代わりではなく、クラスはまだ必要であると主張していることです。インクルード/オートロード(?).

ここでは自動読み込みを使用していません。solution.phpファイルと上記のtest.phpファイルのテストだけです。

誰かが私がここで欠けているものを説明できますか? PHPunitの機能を明示的に含めずにテストが機能するのはなぜですか?

私はPHPUnitをComposerを介してグローバルにインストールしていることに言及する必要があります。

7
Robin Andrews

名前空間を明確にするため(ここではクラスファイルのロードを無視します)

したがって、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;
}

名前空間は、名前の競合を防ぐためのものです。

5

@decezeが言ったように、PHPUnitがあなたに代わって仕事をしてくれましたが、使用するのにファイルが含まれている必要はないと思います。

構造に注意して見てください: https://phpunit.de/manual/current/en/database.html#database.tip-use-your-own-abstract-database-testcase

ヒント:理解しやすいphpunitファイルを開きます。

4
capcj

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

?>
1

useは通常、クラス定義の先頭に配置されている場合、クラス名を短縮するために使用できます。しかし、useがクラス定義内で発生する場合、それはトレイトを含むことを意味します。 https://www.w3schools.com/php/php_oop_traits.asp

1
tenzin