#12622 [Ana->Bgs]: scope of $this and static functions
| From: | derick@php.net | Date: | Sat, 14 Sep 2002 09:16:28 +0000 |
| Subject: | #12622 [Ana->Bgs]: scope of $this and static functions | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-19335@lists.php.net to get a copy of this message | ||
ID: 12622
Updated by: derick@php.net
Reported By: jh@synergy.cx
-Status: Analyzed
+Status: Bogus
Bug Type: Class/Object related
Operating System: linux 2.2
PHP Version: 4.0.6
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
This is how it is implemented, no bug.
Derick
Previous Comments:
------------------------------------------------------------------------
[2002-09-13 00:08:48] shamim@poetryunlimited.com
Further examples - running PHP4.2.2 and NT4/Linux 2.4
Simple example that fails
<?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.
function example(){echo $this->b;}
}
$a=new A;
$a->example();
?>
Simple example that succeeds when it should not
<?php
error_reporting(E_ALL);
// 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();
?>
------------------------------------------------------------------------
[2001-10-21 20:10:48] sniper@php.net
Reproduced with PHP 4.1.0RC1.
Here is better example script (static is reserverd keyword):
<?php
class blaah
{
function method()
{
echo get_class($this);
}
}
class Container
{
function Container()
{
blaah::method();
}
}
$Container = new Container();
?>
------------------------------------------------------------------------
[2001-08-07 11:00:57] jh@synergy.cx
When calling a static function from within another
class the $this - reference is not empty, but it points
to the class in which you call the static function. To
illustrate:
class Static
{ function method()
{ echo get_class($this);
}
}
class Container
{ function Container()
{ Static::method();
}
}
$Container = new Container();
The output is "Container", but there shouldn't be a reference, because
it's not anymore the scope of the
reference.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=12622&edit=1