Bug #51176 [Com]: Static calling in non-static method behaves like $this-
Edit report at https://bugs.php.net/bug.php?id=51176edit=1 ID: 51176 Comment by: daniel dot ruthardt at zoesolutions dot eu Reported by:majkl578 at gmail dot com Summary:Static calling in non-static method behaves like $this- Status: Not a bug Type: Bug Package:Scripting Engine problem Operating System: Irrelevant PHP Version:5.3.2RC3 Assigned To:felipe Block user comment: N Private report: N New Comment: For me, the real issue is to understand the :: operator, if you do, this is absolutely no bug, but consistent and wanted behaviour. To sum it all up, the :: operator tries to call the method in the current context (static vs. non-static) whenever possible and assumes that the current context was meant for non-existing methods. -- In details, the :: operator, does the following: In a non-static context: (1) Operand 1 is the context's class (via name, static or self) (a) if the method is (defined) non-static, it is called non-static in the current context (b) if the method is (defined) static, it is called static (c) if the method is not defined and __call is defined in the contextâs class, __call is called (in the contextâs class) (2) Operand 1 is a parent class of the context's class (via name or parent) (a) if the method is (defined) non-static, it is called non-static in the current context (b) if the method is (defined) static, it is called static (c) if the method is not defined and __call is defined in the contextâs class, a fatal error is issued (d) if the method is not defined and __call is defined in the parentâs class, __call is called (in the parentâs class) (e) if the method is not defined and __call is defined in the contextâs class and in the parentâs class, __call is called in the contextâs class (3) Operand 1 is a class not related to the context (a) if the method is (defined) non-static, it is called non-static in the current context (additionally a strict standards warning is issued) (b) if the method is (defined) static, it is called static (c) if the method is not defined and __callStatic is defined in the not related class, __callStatic is called (in the not related class) Observations: (I) 2c and 2e are inconsistent. In 2c PHP wants to handle the issue in the parent class, whereas in 2e suddenly the issue is handled in the contextâs class. I fail to see consistent arguments here explaining both situations. In a static context: (1) Operand 1 is the contextâs class (via name, static or self) (a) if the method is (defined) static, it is called static (b) if the method is (defined) non-static, it is called static (additionally a strict standards warning is issued) (c) if the method is not defined and __callStatic is defined in the contextâs class, __callStatic is called (in the contextâs class) (2) Operand 1 is a parent class of the contextâs class (via name or parent) (a) if the method is (defined) static, it is called static (b) if the method is (defined) non-static, it is called static (additionally a strict standards warning is issued) (c) if the method is not defined and __callStatic is defined in the contextâs class, a fatal error is issued (d) if the method is not defined and __callStatic is defined in the parentâs class, __callStatic is called (in the parentâs class) (e) if the method is not defined and __callStatic is defined in the contextâs and in the parentâs class, __call is called in the parentâs class (3) Operand 1 is a class not related to the context (a) if the method is (defined) static, it is called static (b) if the method is (defined) non-static, it is called static (additionally a strict standards warning is issued) (c) if the method is not defined and __callStatic is defined in the not related class, __callStatic is called (in the not related class) Observations: (I) As compared to the non-static context, 2c and 2e are consistent. Previous Comments: [2011-07-29 15:57:20] steve at twitpic dot com This is ridiculous- this bug is not bogus, it's completely legitimate, unexpected behavior, and totally non documented. As a reasonable programmer, one expects a static call to behave the same inside of a class as well as outside of a class. How can we bring the desired behavior up for vote? I think that it's insane to not fix it. [2011-05-31 02:06:16] david71rj at gmail dot com Sorry by realive this topic, but I really think that it is a bug. If I want call bar with context, the correct mean is
Bug #51176 [Com]: Static calling in non-static method behaves like $this-
Edit report at https://bugs.php.net/bug.php?id=51176edit=1 ID: 51176 Comment by: steve at twitpic dot com Reported by:majkl578 at gmail dot com Summary:Static calling in non-static method behaves like $this- Status: Bogus Type: Bug Package:Scripting Engine problem Operating System: Irrelevant PHP Version:5.3.2RC3 Assigned To:felipe Block user comment: N Private report: N New Comment: This is ridiculous- this bug is not bogus, it's completely legitimate, unexpected behavior, and totally non documented. As a reasonable programmer, one expects a static call to behave the same inside of a class as well as outside of a class. How can we bring the desired behavior up for vote? I think that it's insane to not fix it. Previous Comments: [2011-05-31 02:06:16] david71rj at gmail dot com Sorry by realive this topic, but I really think that it is a bug. If I want call bar with context, the correct mean is $this-bar(). Else, the static sounds for me like call without context. I'm wrong? Please, read this topic to understand what I'm saying: http://stackoverflow.com/questions/6181603/php-is-handling-incorrectly-my-static- call [2010-11-03 12:03:17] majkl578 at gmail dot com You cannot call foo::start(), because the method is non-static and therefore it does not make sense. Also, self, static and class name are used to call methods statically, not in a object context. For calling method bar in object context, I think '$this-' should be used instead. Obviously parent should not behave this way and respect context, but I think it should be the only exception (as shown in #52713). [2010-11-03 02:45:23] fel...@php.net Hello, I've reverted the wrong changes introduced by trying to fix the issue reported, but actually there is no bug at all. self::bar(), static::bar() and foo::bar() are being called in an object context, hence the __call() is called. I.e. $foo-start(); // invoke the __call method foo::start(); // invoke the __callStatic method Thanks. [2010-11-03 02:35:28] fel...@php.net Automatic comment from SVN on behalf of felipe Revision: http://svn.php.net/viewvc/?view=revisionamp;revision=305043 Log: - Reverted fix for bug #51176 [2010-03-04 14:27:55] fel...@php.net Hello! This isn't my decision, but the release manager. Thanks. The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=51176 -- Edit this bug report at https://bugs.php.net/bug.php?id=51176edit=1
Bug #51176 [Com]: Static calling in non-static method behaves like $this-
Edit report at http://bugs.php.net/bug.php?id=51176edit=1 ID: 51176 Comment by: david71rj at gmail dot com Reported by:majkl578 at gmail dot com Summary:Static calling in non-static method behaves like $this- Status: Bogus Type: Bug Package:Scripting Engine problem Operating System: Irrelevant PHP Version:5.3.2RC3 Assigned To:felipe Block user comment: N Private report: N New Comment: Sorry by realive this topic, but I really think that it is a bug. If I want call bar with context, the correct mean is $this-bar(). Else, the static sounds for me like call without context. I'm wrong? Please, read this topic to understand what I'm saying: http://stackoverflow.com/questions/6181603/php-is-handling-incorrectly-my-static- call Previous Comments: [2010-11-03 12:03:17] majkl578 at gmail dot com You cannot call foo::start(), because the method is non-static and therefore it does not make sense. Also, self, static and class name are used to call methods statically, not in a object context. For calling method bar in object context, I think '$this-' should be used instead. Obviously parent should not behave this way and respect context, but I think it should be the only exception (as shown in #52713). [2010-11-03 02:45:23] fel...@php.net Hello, I've reverted the wrong changes introduced by trying to fix the issue reported, but actually there is no bug at all. self::bar(), static::bar() and foo::bar() are being called in an object context, hence the __call() is called. I.e. $foo-start(); // invoke the __call method foo::start(); // invoke the __callStatic method Thanks. [2010-11-03 02:35:28] fel...@php.net Automatic comment from SVN on behalf of felipe Revision: http://svn.php.net/viewvc/?view=revisionamp;revision=305043 Log: - Reverted fix for bug #51176 [2010-03-04 14:27:55] fel...@php.net Hello! This isn't my decision, but the release manager. Thanks. [2010-03-04 12:33:59] majkl578 at gmail dot com Can you explain me, please, why this is not fixed in 5.3.2 stable? Thank you for the report, and for helping us make PHP better. You are intentionally making PHP worse! The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=51176 -- Edit this bug report at http://bugs.php.net/bug.php?id=51176edit=1