У меня два класса:
class Service {
public static function __callStatic($name, $arguments)
{
// ... opt-out code
$result = call_user_func_array([CacheService::class, $name], $arguments);
// ... opt-out code
}
}
И это
class CacheService
{
public static function __callStatic($name, $arguments)
{
// ... opt-out code
if (self::getCacheInstance()->has('some_cache_key')) {
return call_user_func_array(['self', $name], $arguments);
}
// ... opt-out code
}
public static function getItems()
{
//... do operations
}
}
Когда я вызываю Service::getItems(); из контроллера, он выполняет __callStatic в классе Service, но когда класс Service пытается вызвать getItems() из CacheService, он не выполняет __callStatic в классе CacheService.
В чем именно проблема?






__callStatic выполняется только тогда, когда нет статического метода с именем вызывающего метода
Ваш класс Service не содержит метода getItems(), поэтому __callStatic запускается.
Ваш CacheService содержит его, поэтому вместо него запускается getItems.
http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
Пример:
<?php
class A {
public static function __callStatic() {
echo "A::__callStatic";
}
}
class B {
public static function __callStatic() {
echo "B::__callStatic";
}
public static function getItems() {
echo "B::getItems";
}
}
A::getItems(); // A::__callStatic
B::getItems(); // B::getItems()
B::anotherFunction(); // B::__callStatic