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:
thanks.
We have found this:
http://ru.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.this
(static::) link some like ($this->) and not like (self::), but it is
unexpectedly
Previous Comments:
------------------------------------------------------------------------
[2012-02-14 17:51:03] [email protected]
Because you have written weird code, so we give you an E_STRICT telling you
that
your code is inconsistent and informing you which assumption we made to run
your
bad code. In most simple cases the end-result will be correct. In more complex
cases, it won't, but that's why we point it out with the error.
------------------------------------------------------------------------
[2012-02-14 17:44:32] lx at webactives dot ru
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?
------------------------------------------------------------------------
[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.
?>
------------------------------------------------------------------------
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=61084
--
Edit this bug report at https://bugs.php.net/bug.php?id=61084&edit=1