ID: 19376 User updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] -Status: Won't fix +Status: Open Bug Type: Scripting Engine problem Operating System: Linux/Windows NT 4 PHP Version: 4.2.2 New Comment:
Ok. I'm really having a serious issue with this. I am not asking to fix anything that should eliminate backwards comaptibility, because in any forum you go to, this behavior is wrong, when considering object-oriented programming. All I'm saying is that instead of scanning the class hierarchy from the object class type, in either direction, that the class hierarchy be scanned towards the base class only from the object class type. Each variable carries with it, it's type. You cannot seriously tell me this is difficult to implement, and obviously since you shouldn't be scanning down a hierarchy from the current object's class type anyway, you eliminate needing to spend extra time so the whole process should be faster anyway. Could you please give me one instance where backwards compability would be sacrificed? Having spent a good chunk of my education in studying compilers and optimization and operating systems, I am really having trouble with the overall attitude I'm getting about a problem that in my eyes is a win-win if it's fixed, since we would have a proper object oriented environment where code would not break just because someone was sloppy in setting up their classes. Come on. This is really serious stuff. Because what you're essentially saying is that if 2 class hierarchies are derived from PEAR, and that one of the instances in that hierarchy calls a PEAR function and that PEAR function somehow needs to call something in the other class hierarchy by some derived module, that that SECONDARy static call to the alternative class hierarchy from the same root, would then become a CLASS METHOD call making the situation untenable and the problem unsolvable. Is it just resources? Do you want me to look at the code and find out what would need to be done? All I've been hearing is "We can't do it, it isn't do-able, there's too much that will break". If any of these things were true, PHP would not be the success it is today. So what do you want to do??? I'm game for some collaboration. I'm not asking for a silver bullet. I've ante'd up. Anyone going to call??? Thanks. Previous Comments: ------------------------------------------------------------------------ [2002-09-14 04:17:43] [EMAIL PROTECTED] This is just how it is implemented, and it can now not be changed because of backward compatibility -> won't fix. Derick ------------------------------------------------------------------------ [2002-09-13 00:04:20] [EMAIL PROTECTED] This is not the same as the one in the documentation that you sent me. In the documentation, you are calling A::example directly, or calling B::example which calls up the chain to A. In that context, it's fine. Objects of type B contain an A context. It's when you call B::example from within A::example that all hell breaks loose. Objects of type A have no B context. Example. <?php error_reporting(E_ALL); class A { var $a; // This should be a static call - the only way it makes sense. function example(){echo $this->a;B::Example();} } class B extends A { var $b; // This should fail when called from objects of type A. // And it does, but only because b is undefined, not // because $this is undefined. But since an object of // type A called this static method, $this should not // exist. The error should be undefined variable $this // not undefined property b. function example(){echo $this->b;} } $a=new A; $a->example(); ?> --------------- My 3 class script below also illustrates that not only is the class context passed out of the current object to a static method, when the function call chain returns to the original class, which should have no context, the original context is still carried. I really don't see how this is documented. Is there any further documentation? You're suggesting I subscribe to php-dev?? Duplicated below w/o the results. --------------- <?php // Example of bug in PHP class method passing $this incorrectly class test1 { var $a; function test1() function showMe() { // Since test3::showMe was called as a static method // This too should be a static method call with no $this echo 'In test1::showMe<hr>'; echo 'Next 2 lines should fail since this method was not called from within this object<br>'; echo '$this is of type '. get_class($this)." in test3::showMe<br>\n"; echo "test1::showMe:a=".$this->a."<br>\n"; } // Class member to test static method call function callMe() { echo 'In test1::callMe<hr>'; echo '$this is of type '.get_class($this)."in test1::callMe<hr>\n"; echo 'Calling class method test3::showMe from an object of type test1<br>'; echo '$this should not be passed since test3::showMe does not exist in objects of type test1<hr>'; // This is a static method call, since test1 objects // do not have a test3::showMe. test3::showMe(); } } class test2 extends test1 { function showMe() { echo 'In test2::showMe<br>'; echo "Next 2 lines should fail since objects of type test1 cannot pass \$this<hr>\n"; echo '$this is of type '. get_class($this)." in test2::showMe<br>\n"; echo "test2::showMe:a=".$this->a."<hr>\n"; echo 'Calling parent::showMe<hr>'; // Since test3::showMe was called as a static method // This too should be a static method call with no $this parent::showMe(); } } class test3 extends test2 { function showMe() { echo 'In test3::showMe<br>'; echo "Next 2 lines should fail since objects of type test1 cannot pass \$this<hr>\n"; echo '$this is of type '. get_class($this)." in test3::showMe<br>\n"; echo "test3::showMe:a=".$this->a."<hr>\n"; echo 'Calling parent::showMe<hr>'; // Since test3::showMe was called as a static method // This too should be a static method call with no $this parent::showMe(); } } // object $a is of type test1 $a=new test1; $a->callMe(); ?> ------------------------------------------------------------------------ [2002-09-12 23:50:43] [EMAIL PROTECTED] oops forgot to mention - its documented http://www.php.net/manual/en/keyword.paamayim-nekudotayim.php "In this context, there is a current object and it may have object variables. Thus, when used from WITHIN an object function, you may use $this and object variables." ------------------------------------------------------------------------ [2002-09-12 23:45:09] [EMAIL PROTECTED] dupe of http://bugs.php.net/bug.php?id=12622 I'm not sure if it will be fixed.. nobody has commented on 12622 It may be worth posting a question on php-dev, just to get a more definitive answer... ------------------------------------------------------------------------ [2002-09-12 23:33:07] [EMAIL PROTECTED] Please see bug report http://bugs.php.net/bug.php?id=19384 for further details. You say that static method calls take $this with them? But how can they take them OUT OF the current class? Which $this is in effect in the class of the static method?? What happens if the static method call has it's own variable of the same name or function? I did not see anywhere in the documentation that states that static method calls take $this with them, even out of the current class. I'm confused. How can an object of type A call a static method of class B and have $this taken with it??? This violates class scoping as far as I understand it. I don't see how this would enable multiple inheritance, especially since PHP is supposed to be single inheritance anyway. You're saying this isn't a bug? Isn't that like someone telling me a year ago that &new was necessary and it wouldn't be fixed because it was a feature, and now Zend 2.0 will do it by default??? Suggestions? Where should I take this issue? And where do I find the documentation that clearly describes the expected behavior. 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 http://bugs.php.net/19376 -- Edit this bug report at http://bugs.php.net/?id=19376&edit=1