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

Опитвам се да имитирам дефиницията на вградената функция usort на php в моята реализация по-долу:

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
тъй като вашето обратно извикване не е валидно, опитайте utility::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 иска callable .. получавате грешката, защото potato не е внедрил __invoke вижте php.net/manual/en/language.oop5.magic.php#object.invoke - person Baba; 04.04.2013
comment
Целта на примера с картофа е да илюстрира, че проблемът не е, че аргументът не е от правилния тип, а че типът, който OP декларира, не съществува в неговата версия и грешката просто ще препраща към всеки фалшив тип, който сте въвели. - person Sammitch; 04.04.2013