Нужна помощь с php5.3 статическим наследованием - PullRequest
2 голосов
/ 22 декабря 2010

Возникли небольшие проблемы с этим статическим «наследованием» в php 5.3. Мне нужно проверить, существует ли статическая функция в статическом классе, но мне нужно проверить ее из родительского статического класса.

Я знаю вphp 5.3 Я могу использовать ключевое слово static для имитации ключевого слова this.Я просто не могу найти способ проверить, существует ли функция.

Вот пример:

// parent class
class A{

// class B will be extending it and may or may not have 
// static function name 'func'
// i need to test for it

    public static function parse(array $a){
        if(function_exists(array(static, 'func'){
            static::func($a);
        }
    }
}

class B extends A {
    public static function func( array $a ){
        // does something
    }
}

Так что теперь мне нужно выполнить B::parse();, идея в том, что если подкласс имеетфункция, она будет использоваться, в противном случае она не будет использоваться.

Я пытался:

function_exists(static::func){}
isset(static::func){}

Эти 2 не работают.

Любые идеи, как это сделатьэтот?Кстати, я знаю о возможности передачи лямбда-функции в качестве обходного пути, это не вариант в моей ситуации.

У меня такое ощущение, что есть очень простое решение, о котором я сейчас не могу думать.

Теперь мне нужно позвонить

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Вы не можете использовать function_exists для классов и объектов (методов), только для функций.Вы должны использовать method_exists или is_callable.isset работает только с переменными.Кроме того, static не имитирует $this, это две совершенно разные вещи.

При этом в данном конкретном случае вы должны использовать is_callable с цитируемым ключевым словом static:

if (is_callable(array('static', 'func'))) {
    static::func();
}

или ...

if (is_callable('static::func')) {
    static::func();
}
0 голосов
/ 22 декабря 2010

Попробуйте

public static function parse(array $a){
    if(function_exists(array(get_called_class(), 'func') {
/*...*/

См. http://php.net/get_called_class

...