call_user_func_array не выполняет магический метод __callStatic - PullRequest
0 голосов
/ 24 августа 2018

У меня есть эти два класса:

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 классе.В чем именно проблема?

1 Ответ

0 голосов
/ 24 августа 2018

__callStatic выполняется только при отсутствии статического метода с именем вызывающего метода

Ваш класс Service не содержит метод getItems(), поэтому __callStatic выполняется.

Ваш CacheService содержит его, поэтому вместо него

выполняется *1011*

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
...