Можно ли вызвать обычный метод в __callStatic?

Всем привет !
В данный момент читаю книгу "PHP Cookbook (3rd edition)" от David Sclar, Adam Trachtenberg.
В главе 7.15 приведен код ,я туда добавил свой метод WhyNotCall():

class User {
public function WhyNotCall(){
 echo "1 2 3";
}
static function find($args) {
 echo "<pre>";
 print_r($args);
 echo "</pre>";
}
static function __callStatic($method, $args) {
 if (preg_match('/^findBy(.+)$/', $method, $matches)) {
   return static::find(array('field' => $matches[1],
     'value' => $args[0]));
 }
}
}
$user = User::findById(123);
$user = User::findByEmail('rasmus@php.net');


Вопросы:
1) Мне хотелось бы добавить этот метод в __callStatic, чтобы она всегда выполнялась при вызове некого статического метода. Как сделать это? Я пробовал добавить это в __callStatic прямо перед return :
...
$this->WhyNotCall();
...

не помогло.

2) Почему static ? Просто впервые вижу такую конструкцию
.....
 return static::find(array('field' => $matches[1],
     'value' => $args[0]));
.....
  • Вопрос задан
  • 2325 просмотров
Решения вопроса 1
@IceJOKER
Web/Android developer
Не совсем понял вопрос.

_callStatic - магический метод, который срабатывает при вызове несуществующего статического метода.
Если вы собирались вызвать не статический метод вызвать в статическом, то это у вас не выйдет, т.к. this не сработает, ибо статический метод не может обратиться к определенному объекту, то есть статичные данные для всех объектов одни и те же
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vshemarov
@vshemarov
Почему static ?

Почитайте про позднее статическое связывание. Если кратко, то self указывает на класс, где определен метод, а static вычисляет класс в момент вызова (с учетом возможных наследований).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
23 апр. 2024, в 19:21
300 руб./за проект
23 апр. 2024, в 19:05
15000 руб./за проект
23 апр. 2024, в 19:01
7000 руб./за проект