Задать вопрос
@bizzonaru

Почему нельзя вызвать __call из родительского класса?

Есть такой код:
class A {

    public function __call($method, $args) {
        echo " A => ".$method."  ".implode(',', $args)."\n";
    }

}

class B extends A {

    public function __call($method, $args) {
        echo " B => ".$method."  ".implode(',', $args)."\n";   
    } 

    public function me() {
        parent::test(1,3);
    } 
}

$b = new B();
$b->me();


При выполнении, получается, что зовется call от дочернего класса B, почему?

B => test 1,3
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
rdifb0
@rdifb0
Программист, реалист
При выполнении, получается, что зовется call от дочернего класса B, почему?

Потому что вы его переопределили? Как вы себе представляете наследование с переопределением, если бы предки всегда вызывали только свои методы? Каждый вызов метода проходит всю цепочку наследования по новой.
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
На то они и магические методы, чтоб работали магически.
Видимо у магии своя специфика работы/наследования.
Почему не нашел, "решение" нашёл.

<?php
class A {

    public function __call($method, $args) {
        echo " A => ".$method."  ".implode(',', $args)."\n";
    }

}

class B extends A {

    public function __call($method, $args) {
        echo " B => ".$method."  ".implode(',', $args)."\n";   
    } 

    public function me() {
        parent::__call('test', [1,3]);
    } 
}

$b = new B();
$b->me();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽