Михаил Чудинов

Написал, вручную при тестировании получаю результат соответствующий из readme и примерам в тестах. При нажатии кнопку "Проверить" получаю ошибку суть которой мне не понятна, как будто 2 раза этот файл при проверке сервер инклюдит и считает что функция 2 раза декларируется.

PHP Fatal error:  Cannot redeclare App\Solution\OneCount() (previously declared in /usr/src/app/Solution.php:13) in /usr/src/app/Solution.php on line 13

Код

<?php

namespace App\Solution;

require getenv('COMPOSER_HOME') . '/vendor/autoload.php';

use function Functional\sort as fsort;

// BEGIN (write your solution here)
function sortByBinary($collection) 
{

    function OneCount($list) //функция для подсчета элементов масива со значением "1"
    {
    $count = function ($acc, $item) {
    if ($item == "1"){$acc++;};
    return $acc;
    };
    return array_reduce($list, $count, 0);
    };    

    $condition = function($left, $right)
    {
    $left_bin_array = str_split(decbin($left));   
    $right_bin_array = str_split(decbin($right));   
    if (OneCount($left_bin_array) > OneCount($right_bin_array)){return 1;};
    if (OneCount($left_bin_array) < OneCount($right_bin_array)){return -1;};
    if (OneCount($left_bin_array) == OneCount($right_bin_array))
        {
            if ($left > $right){return 1;};
            if ($left < $right){return -1;};
            if ($left == $right){return 0;};
        };
    }; 

return fsort($collection, $condition);

//phpunit SolutionTest --filter testout
};
// END

В файл теста добавил:

    public function testout()
{
echo "\n";
$collection = [10, 100, 50, 31, 0, 23, 89];
var_dump(sortByBinary($collection));
}

3 0

Превратил function OneCount($list) в $OneCount = function ($list)

поменял вызов соответственно, и тест стал проходится. не пойму в чем прикол?

В php нельзя использовать обычную именованную функцию внутри функции? А почему отдельный написанный юнит тест нормально вызывался и выдавал результат, а кнопка "проверить" выдавала "Fatal error"?

0

Добрый день!

В теле функции sortByBinary вы определяете функцию OneCount. Дело в том, что все функции в PHP имеют глобальную область видимости, поэтому вызвав однажды sortByBinary вы определяете функцию OneCount и помещаете её в глобальную область видимости. Это приводит к тому, что при повторном вызове sortByBinary будет попытка повторного объявления функции OneCount, которая уже существует в глобальной области видимости - что и приводит к ошибке Cannot redeclare App\Solution\OneCount() (previously declared in /usr/src/app/Solution.php:13) in /usr/src/app/Solution.php on line 13

Это не относится к анонимным функциям, которые будучи записанные в какую-либо переменную, ведут себя с точки зрения области видимости как обыкновенные переменные

1

Исчерпывающий ответ, благодарю!

0

Похожие вопросы

Maxim Korobov 02 апреля 2019 →

Здравствуйте! Хотел спросить для лучшего понимания вопроса - почему в решении учителя столько условий? Напр...

Валентин Иванов 26 марта 2019 →

Что-то мое решение слишком короткое получилось. https://ru.hexlet.io/code_reviews/100027 Не понял, почему в...

Евгений Илюхин 19 сентября 2017 →

Добрый день! Сортировка по количеству единиц в двоичном, затем по десятичному виду. При проверке: а) даетс...

Юрий Быков 26 апреля 2017 →

Помнится, в одном из видео Кирилла по ментальному программированию, говорилось, что использование флага для...

Валерий Симонов 15 апреля 2017 →

Кирилл, как вам мой код?

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →