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 шт):

Автор решения: Daniel Protopopov

PSR-4 стандарт был создан для автозагрузки классов, а у вас классы не используются. Добавьте

require(__DIR__."/../../src/phpZoneTasks/LargestPossibleNumberFromOthers.php");

в тесте, и проблема будет решена.

→ Ссылка