Если мы попытаемся обратиться к несуществующему методу, то получим фатальную ошибку.
Однако, иногда возникает необходимость либо выполнить какой-то код при отсутствии нужного нам метода, либо узнать какой метод пытались вызвать, либо использовать другое API для вызова нужного нам метода. С этой целью и существуют методы __call() и __callStatic() — они перехватывают обращение к несуществующему методу в контексте объекта и в статическом контексте, соответственно.
class OurClass { public function __call($name,array $params) { echo 'Вы хотели вызвать $Object->'.$name.', но его не существует, и сейчас выполняется '.__METHOD__.'()
' .PHP_EOL; return; } public static function __callStatic($name,array $params) { echo 'Вы хотели вызвать '.__CLASS__.'::'.$name.', но его не существует, и сейчас выполняется '.__METHOD__.'()'; return; } } $Object=new OurClass; #Вы хотели вызвать $Object->DynamicMethod, но его не существует, и сейчас выполняется OurClass::__call() $Object->DynamicMethod(); #Вы хотели вызвать OurClass::StaticMethod, но его не существует, и сейчас выполняется OurClass::__callStatic() OurClass::StaticMethod();