On 2024-03-30 13:06, 하늘아부지 wrote:
Even currently, `__callStatic` is called in cases of non-static methods
that are not public methods. `__callStatic` already acts as a
rule-breaker.
I think the problem here is a confusion based on the idea that there is
necessarily some direct correspondence between method names and strings
passed to __callStatic. It's like confusing URLs with file paths.
The fact that an object *may* have a private method named "foo" doesn't
have any bearing on whether classname::foo() invokes __callStatic('foo')
or not. The existence or otherwise of such methods in the class is
irrelevant. __callStatic receives a string, and what it does with that
string is entirely up to whoever is writing it.
class First {
protected static function test(): string {
return "Calling First::test\n";
}
}
class Second extends First
{
public static function __callStatic(string $name, array $args): string {
return "Calling callStatic::$name\n";
}
public static function pass(): string {
return Second::test(); // The inherited method
}
}
echo Second::pass();
echo Second::test(); // Not the inherited method