PHP7.4: При использовании namespace не распознается имя функции при выполнении (но при написании кода все Ок). ИИ сломали голову, и я тоже
Решил понабивать руку для решения различных интервьюшных задач, причем все комплексно: composer, PHPUnit...
Вроде сделано все правильно, и по структуре и по вложенности. Но при запуске теста сообщение: вызов неопределенной функции.
При этом: при написании кода в IDE им функции подставляется, описание параметров берется из PHPDoc-структуры для нее. При подключении через required - все Ок, но это ж "неправильно".
Теперь конкретика.
Структура "проекта"
PHPInterviewTasks/
├── src/
│ ├── phpZoneTasks/
│ │ └── LargestPossibleNumberFromOthers.php
├── tests/
│ ├── phpZoneTasksTests/
│ │ └── LargestPossibleNumberFromOthersTest.php
├── vendor/
├── composer.json
└── phpunit.xml
LargestPossibleNumberFromOthers.php:
<?php
namespace PHPInterviewTasks\phpZoneTasks;
function getLargeNumberFromOthers (string $line): string
{
$tmp_array = explode(" ", $line);
usort($tmp_array, function($p1, $p2) {
$order1 = $p1 . $p2;
$order2 = $p2 . $p1;
return $order2 <=> $order1;
});
return implode('', $tmp_array);
}
файл с тестом LargestPossibleNumberFromOthersTest.php:
<?php
use PHPUnit\Framework\TestCase;
//use function InterviewTasks\phpZoneTasks\getLargeNumberFromOthers;
use function \PHPInterviewTasks\phpZoneTasks\getLargeNumberFromOthers;
use \PHPInterviewTasks\phpZoneTasks;
//require_once __DIR__ . '/../../src/phpZoneTasks/LargestPossibleNumberFromOthers.php';
class LargestPossibleNumberFromOthersTest extends TestCase {
public function testGetLargeNumberFromOthers()
{
$this->assertEquals("9958142211100", getLargeNumberFromOthersAlias("100 95 9 2 42 11 81"));
}
}
P.S. по закоментаренным вариантом use видна часть экспериментов.
Ну и composer.json
{
"name": "php-projects/interview-tasks",
"description": "Examples, Solutions for interview",
"minimum-stability": "stable",
"license": "proprietary",
"authors": [
{
"name": "vitaly_root",
"email": "[email protected]"
}
],
"require": {
"php": ">=7.4"
},
"require-dev": {
"phpunit/phpunit": "^9.5"
},
"autoload": {
"psr-4": {
"PHPInterviewTasks\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"PHPInterviewTasks\\Tests\\": "tests/"
}
},
"scripts": {
"test": "phpunit"
}
}
2 AI системы ходят уже тупо по кругу. Буду признателен за рабочий вариант приведения этого безобразия в правильный вид.
Ответы (1 шт):
PSR-4 стандарт был создан для автозагрузки классов, а у вас классы не используются. Добавьте
require(__DIR__."/../../src/phpZoneTasks/LargestPossibleNumberFromOthers.php");
в тесте, и проблема будет решена.