использование callable в php

Я пытаюсь имитировать встроенное в php определение функции usort в моей реализации ниже:

class heapSort {
    static function hsort(array &$array, callable $cmp_function){
       // logic
    }
}

class utility{
    static function mycomparator(){
        // logic
    }
}

$array = array(5,3,8,1);
$callback = array('utility','mycomparator');
heapSort::hsort($array, $callback);

Хотя переменная $callback является «вызываемой», почему я получаю ошибку ниже фатальной?

Аргумент 2, переданный в heapSort::hsort(), должен быть экземпляром callable.

В частности, как мне сделать/привести тип $variable к вызываемому?


person pranay    schedule 04.04.2013    source источник
comment
callable не является фактическим типом до версии 5.4, см. документацию больше информации, но ваш код кажется правильным. Какая это версия PHP?   -  person Sammitch    schedule 04.04.2013
comment
поскольку ваш обратный вызов недействителен, попробуйте утилиту :: mycomparator вместо массива.   -  person mpm    schedule 04.04.2013


Ответы (1)


callable поддерживается только PHP 5.4 попробуйте вместо него использовать is_callable

static function hsort(array &$array, $cmp_function) {
    if (! is_callable($cmp_function))
        throw new InvalidArgumentException("Function not callable");
}
person Baba    schedule 04.04.2013
comment
После собственного тестирования я собирался опубликовать этот же код. Если вы измените исходный код с callable $cmp_function на potato $cmp_function, вы получите ошибку: Argument 2 passed to heapSort::hsort() must be an instance of potato. - person Sammitch; 04.04.2013
comment
OP хочет вызываться ... вы получили ошибку, потому что potato не реализовал __invoke см. php.net/manual/en/language.oop5.magic.php#object.invoke - person Baba; 04.04.2013
comment
смысл примера с картошкой состоит в том, чтобы проиллюстрировать, что проблема не в том, что аргумент был неправильного типа, а в том, что тип, который объявляет OP, не существует в его версии, и ошибка будет просто ссылаться на любой фальшивый тип, который вы ввели. - person Sammitch; 04.04.2013