call_user_func_array不执行__callStatic魔法方法
call_user_func_array does not execute __callStatic magic method
我有这两个 classes:
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();
时,它在 Service
class 中执行 __callStatic
,但是当 Service
class 尝试从 CacheService 调用 getItems()
,它不会在 CacheService
class 中执行 __callStatic
。
到底是什么问题?
__callStatic
只在没有调用方法名
的静态方法时执行
您的 Service
class 不包含 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
我有这两个 classes:
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();
时,它在 Service
class 中执行 __callStatic
,但是当 Service
class 尝试从 CacheService 调用 getItems()
,它不会在 CacheService
class 中执行 __callStatic
。
到底是什么问题?
__callStatic
只在没有调用方法名
您的 Service
class 不包含 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