PHP: ошибка вызова неопределенного метода при вызове статического метода из родителя

Как правильно вызвать метод дочернего класса из родительского класса, если оба являются статическими?

Когда я использую статические классы, он возвращает ошибку "Вызов неопределенного метода A::multi()", однако, когда я использую нестатические методы, проблем нет, например:

//-------------- STATIC ------------------
class A {
    public static function calc($a,$b) {
        return self::multi($a, $b);
    }
}
class B extends A {
    public static function multi($a, $b) {
        return $a*$b;
    }
}
echo B::calc(3,4); //ERROR!!

//-------------- NON-STATIC ----------------
class C {
    public function calc($a,$b) {
        return $this->multi($a, $b);
    }
}
class D extends C {
    public function multi($a, $b) {
        return $a*$b;
    }
}
$D = new D();
echo $D->calc(3,4); // Returns: 12

Есть ли способ вызвать дочерний статический метод, не зная имени его класса?


person lepe    schedule 24.06.2010    source источник
comment
Я нашел причину: как указано в ошибке № 30934 (которая на самом деле не ошибка, а следствие дизайнерского решения), ключевое слово self связывается во время компиляции. Помимо прочего, это означает, что в методах базового класса любое использование ключевого слова self будет ссылаться на этот базовый класс независимо от фактического (производного) класса, для которого был вызван метод. (по адресу: php.net/manual/en/function.get -class.php#77698) Однако мне все еще нужно решение...   -  person lepe    schedule 24.06.2010
comment
Для справки, это решается в PHP 5.3 (как предложил BoltClock) с помощью: return static::multi($a, $b); вместо использования self в родительском классе.   -  person lepe    schedule 24.06.2010


Ответы (1)


Это возможно только в PHP 5.3 и новее с поздним статическим привязки, где PHP 5.3 может обращаться к статическим членам в подклассах, а не к любому классу, на который ссылается self, потому что он разрешается во время выполнения, а не во время компиляции.

К сожалению, я не думаю, что для этого есть решение в PHP 5.2 и старше.

person BoltClock    schedule 24.06.2010
comment
Да, это то, что я читал... Все равно спасибо! (Я должен обновить PHP...) - person lepe; 24.06.2010
comment
-1 Нет наследования статических членов. В подклассе есть копия статических методов, если они не переопределены, но это не наследование. - person Artefacto; 24.06.2010
comment
@Artefacto: Понятно, плохо. Я исправил свой ответ соответственно. - person BoltClock; 24.06.2010