#19384 [Opn->Dup]: Class methods passing $this context incorrectly when accessing static methods
| From: | alan_k@php.net | Date: | Fri, 13 Sep 2002 04:47:01 +0000 |
| Subject: | #19384 [Opn->Dup]: Class methods passing $this context incorrectly when accessing static methods | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-19289@lists.php.net to get a copy of this message | ||
ID: 19384
Updated by: alan_k@php.net
Reported By: shamim@poetryunlimited.com
-Status: Open
+Status: Duplicate
Bug Type: Scripting Engine problem
Operating System: Linux/Windows NT4
PHP Version: 4.2.2
New Comment:
dupe of http://bugs.php.net/bug.php?id=12622
Previous Comments:
------------------------------------------------------------------------
[2002-09-12 23:03:39] shamim@poetryunlimited.com
<?php
// Example of bug in PHP class method passing $this incorrectly
class test1
{
var $a;
function test1(){$this->a=1;}
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();
/* Results
In test1::callMe
--------------------------------------------------------------------------------
$this is of type test1in test1::callMe
--------------------------------------------------------------------------------
Calling class method test3::showMe from an object of type test1
$this should not be passed since test3::showMe does not exist in
objects of type test1
--------------------------------------------------------------------------------
In test3::showMe
Next 2 lines should fail since objects of type test1 cannot pass $this
--------------------------------------------------------------------------------
$this is of type test1 in test3::showMe
test3::showMe:a=1
--------------------------------------------------------------------------------
Calling parent::showMe
--------------------------------------------------------------------------------
In test2::showMe
Next 2 lines should fail since objects of type test1 cannot pass $this
--------------------------------------------------------------------------------
$this is of type test1 in test2::showMe
test2::showMe:a=1
--------------------------------------------------------------------------------
Calling parent::showMe
--------------------------------------------------------------------------------
In test1::showMe
--------------------------------------------------------------------------------
Next 2 lines should fail since this method was not called from within
this object
$this is of type test1 in test3::showMe
test1::showMe:a=1
*/
?>
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=19384&edit=1