> Le 28 mars 2024 à 03:29, 하늘아부지 <daddyof...@gmail.com> a écrit : > > Hi. > > I would like to register an RFC on the following issue. > https://github.com/php/php-src/issues/13813 > > To summarize briefly, users expect that the `__callStatic` magic method will > be called in all cases when a method is not static while using the > `__callStatic`. However, in reality, if the method is public, the > `__callStatic` magic method is not called, and an error still occurs. > > I would like to hear your opinions. > I also hope someone can help with the RFC registration. > > > -------------------------------------------------------- > > ```php > <?php > class MyClass > { > public static function __callStatic($method, $args) > { > echo $method . "\n"; > } > > private function privateMethod() {} > protected function protectedMethod() {} > public function publicMethod() {} > } > > MyClass::privateMethod(); > MyClass::protectedMethod(); > MyClass::publicMethod(); > ``` > > Resulted in this output: > ``` > privateMethod > protectedMethod > Fatal error: Uncaught Error: Non-static method MyClass::publicMethod() cannot > be called statically in ... > ``` > > But I expected this output instead: > ``` > privateMethod > protectedMethod > publicMethod > ``` > > >
Hi, One of the issue is that it is not possible to determine statically that a certain call is static or not. It is possible to determine it at runtime; but you must be careful to articulate clearly the rules. Although it is absolutely possible to have logical rules, I fear that they couldn’t be sufficiently simple in order to avoid confusion. In the following real-world (but hopefully rare) case (it is taken from my own codebase), I am calling a method of a grandparent class. It is *not* a static method: ```php foo = new class(/* ... */) extends Bar { // ... function Header() { $grandparent_class = get_parent_class(parent::class); $grandparent_class::Header(); // ... rest of code } // ... }; ``` In the following more general case, I might intend to call to a static method. However, as of today, a call to a non-static method will occur if `A` has a non-static accessible method `qux()` *and* `$this` is an instance of `A`: ```php class Foo { function baz() { A::qux(); } } ``` (In older versions of PHP, a non-static call would occur even when `$this` is not an instance of `A`. Hopefully, this is no longer the case since PHP 8.) —Claude