Edit report at https://bugs.php.net/bug.php?id=61084&edit=1
ID: 61084
User updated by: lx at webactives dot ru
Reported by: lx at webactives dot ru
Summary: incorrect work with class variable (declared as
static)
Status: Not a bug
Type: Bug
Package: Class/Object related
Operating System: Windows
PHP Version: 5.3.10
Block user comment: N
Private report: N
New Comment:
yes, i'm use Late-Static-Binding, but why engine bind variable to class C in
context of class A? I'm not extend C from A. I can modify my code for
demonstrate necessity late binding:
<?
error_reporting(E_ALL);
class A {
static $v = 'A';
function m(){
echo 'var is '.(static::$v);
}
}
class B extends A{ // for use Late-Static-Binding
static $v = 'B';
}
class C {
static $v = 'C';
function test(){
B::m();
}
}
$test = new C();
$test->test();
?>
Of course, I'm can correctly use static keyword before method m() and problem
have solved. But current engine behavior make work logic unpredictable.
In doc I have read: "In case of static method calls, this is the class
explicitly named (usually the one on the left of the :: operator);" Why PHP
engine bind variable context for object caller class and not for class method
owner?
Previous Comments:
------------------------------------------------------------------------
[2012-02-14 17:44:15] [email protected]
Sorry, slightly misleading explanation there, I guess. But the clue is in the
E_STRICT you get:
Strict Standards: Non-static method A::m() should not be called statically,
assuming $this from incompatible context...
See the "assuming $this" there? Since you have instantiated class C and you are
calling methods non-statically it assumes the non-static context. In the non-
static context var is going to be C because of LSB.
------------------------------------------------------------------------
[2012-02-14 17:19:52] [email protected]
I still don't see what is wrong. Forget the fact that you are calling a non-
static method statically. That has nothing to do with the inner access to the
static property. Because of Late-Static-Binding (see http://php.net/lsb)
static::$v will be late-bound to class C so you get the static value from C.
This is perfectly correct. If you use self::$v you will be early-bound to A
instead.
Other than the E_STRICT about calling a non-static method statically, you
should
get no errors here because you are accessing a static property statically
correctly.
------------------------------------------------------------------------
[2012-02-14 17:01:15] lx at webactives dot ru
I'm known it, but error message incorrect. You can see it on this code:
<?
error_reporting(E_ALL);
class A {
static $v = 'A';
function m(){
echo 'var is '.(static::$v);
}
}
class C {
static $v = 'C';
function test(){
A::m();
}
}
$test = new C();
$test->test(); //display incorrect "var is C" without any error.
?>
------------------------------------------------------------------------
[2012-02-14 16:24:44] [email protected]
In PHP 5.3 E_STRICT is not included in E_ALL. Your code does give you an
E_STRICT. Use error_reporting(-1); at the top.
------------------------------------------------------------------------
[2012-02-14 15:19:12] lx at webactives dot ru
Description:
------------
All configuration standard.
Test script:
---------------
<?
error_reporting(E_ALL);
class A {
static $v = '123';
function m(){
echo 'var is '.(static::$v);
}
}
class C {
function test(){
A::m();
}
}
$test = new C();
$test->test();
?>
Expected result:
----------------
PHP Fatal error: Access to undeclared static method: A::m() in test.php on line
11
OR
STRICT CLASSIC ERROR ONLY
Actual result:
--------------
PHP Fatal error: Access to undeclared static property: C::$v in test.php on
line 6
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=61084&edit=1