Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use vs Include in PHP

I'm trying to get my head around PHP namespaces and testing with PHPUnit.

These tests from Codewars pass when I run phpunit test.php in the command line on Windows:

<?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);
  }
}

However, when I comment out use PHPUnit\Framework\TestCase; I get Class 'TestCase' not found which makes sense since there is no reference to the needed classes/functions.

What's confusing me though is that lots of answers here on SO about namespacing claim that the use keyword is NOT a substitute for include/require and that the classes still need to be included/autoloaded(?).

I'm not using any autoloading here - just a solution.php file and the tests above in a test.php file.

Can someone please explain what I'm missing here? How come the tests work without any explicit including of the PHPunit functionality?

I should mention that I have PHPUnit installed globally via Composer.

like image 207
Robin Andrews Avatar asked Mar 31 '17 11:03

Robin Andrews


3 Answers

use doesn't include anything. It just imports the specified namespace (or class) to the current scope, you need to have an autoloader set up in order to include the file in which the namespace is defined. Read more about autoloading here:http://php.net/manual/en/language.oop5.autoload.php

The include statement includes and evaluates the specified file.

Example:

<?php

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

?>

test.php
<?php

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

include 'vars.php';

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

?>
like image 80
Shakti Phartiyal Avatar answered Oct 23 '22 01:10

Shakti Phartiyal


To make namespaces clear (ignore load of the class file here)

So in one php-file:

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;
}

Namespace are for preventing name-conflicts!

like image 39
JustOnUnderMillions Avatar answered Oct 23 '22 03:10

JustOnUnderMillions


Like @deceze said, the PHPUnit did the job for you, but don't think that use will not require the file included.

Look with atention to the structure: https://phpunit.de/manual/current/en/database.html#database.tip-use-your-own-abstract-database-testcase

PRO-TIP: Open the phpunit files that you'll understand better.

like image 36
capcj Avatar answered Oct 23 '22 03:10

capcj