Re: [PHP-DEV] Re: static:: and PHP 7 (from bug #70997)

2015-11-30 Thread Xinchen Hui
Hey:

> On Nov 30, 2015, at 22:48, Rowan Collins  wrote:
> 
> Andreas Heigl wrote on 30/11/2015 12:23:
>>> Am 30.11.15 um 13:18 schrieb Peter Cowburn:
>>> class A {
 const TEST = false;
 public function test() {
 var_dump(static::TEST);
 }
 }
 
 class B extends A {
 const TEST = true;
 
 public function test() {
 A::test();
 }
 }
 
 $b = new B;
 $b->test();
>> You are calling explicitly A::test().
>> 
>> When you call parent::test() everything works as you'd expect it.
>> 
>> Have a look at https://3v4l.org/RCrRd
>> 
>> Apart from that you are calling an instance-method as a static method by
>> using A::test().
> 
> This appears to be the crucial thing: if you declare the test() method as 
> static in both classes, it returns false in all versions: 
> https://3v4l.org/hJoor
> 
> It's almost like A::test() is now interpreted as a static call, rather than a 
> "scope resolution" of the instance method, but $this is still available, so 
> it's not quite as simple as that: https://3v4l.org/qbT3j
> 
dmitry has committed a fix, please have a look

Thanks
> Regards,
> -- 
> Rowan Collins
> [IMSoP]
> 
> 
> 
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-DEV] Re: static:: and PHP 7 (from bug #70997)

2015-11-30 Thread Peter Cowburn
On 30 November 2015 at 12:16, Peter Cowburn  wrote:

> Hi internals,
>
> I'm looking for some feedback on a change with regard to static::, which
> has been present throughout the 7 branch.
>
> Have a look-see at https://bugs.php.net/bug.php?id=70997
>
> 
> class A {
> const TEST = false;
> public function test() {
> var_dump(static::TEST);
> }
> }
>
> class B extends A {
> const TEST = true;
>
> public function test() {
> A::test();
> }
> }
>
> $b = new B;
> $b->test();
>
> ?>
>
> In PHP 7 it dumps true, in PHP 5 false.
>

Gah, this was inevitable!  In PHP 7 it dumps FALSE, in PHP 5 TRUE. Stupid
brain.


>
> I'm looking for info on when, where, why it was introduced, and ultimately
> some clarification of:
> a) was this intentional
> b) it is going to stay (i.e. "not a bug")
> c) some more to go on so I can document the change clearly
>
> If there is already a line in NEWS/UPGRADING or a commit you can point me
> to, that would be amazing.
>
> Whatever tangents this topic wanders off on, I'd like to eventually pull
> it back to the bug report mentioned above with one eye on formulating the
> docs changes (if it's really "not a bug").
>
> Cheers,
>
> A docs guy.
>
>


Re: [PHP-DEV] Re: static:: and PHP 7 (from bug #70997)

2015-11-30 Thread Andreas Heigl
Am 30.11.15 um 13:18 schrieb Peter Cowburn:
> class A {
>> const TEST = false;
>> public function test() {
>> var_dump(static::TEST);
>> }
>> }
>>
>> class B extends A {
>> const TEST = true;
>>
>> public function test() {
>> A::test();
>> }
>> }
>>
>> $b = new B;
>> $b->test();
>>
You are calling explicitly A::test().

When you call parent::test() everything works as you'd expect it.

Have a look at https://3v4l.org/RCrRd

Apart from that you are calling an instance-method as a static method by
using A::test().

Cheers

Andreas

-- 
  ,,,
 (o o)
+-ooO-(_)-Ooo-+
| Andreas Heigl   |
| mailto:andr...@heigl.org  N 50°22'59.5" E 08°23'58" |
| http://andreas.heigl.org   http://hei.gl/wiFKy7 |
+-+
| http://hei.gl/root-ca   |
+-+



smime.p7s
Description: S/MIME Cryptographic Signature


Re: [PHP-DEV] Re: static:: and PHP 7 (from bug #70997)

2015-11-30 Thread Rowan Collins

Andreas Heigl wrote on 30/11/2015 12:23:

Am 30.11.15 um 13:18 schrieb Peter Cowburn:

class A {

 const TEST = false;
 public function test() {
 var_dump(static::TEST);
 }
}

class B extends A {
 const TEST = true;

 public function test() {
 A::test();
 }
}

$b = new B;
$b->test();


You are calling explicitly A::test().

When you call parent::test() everything works as you'd expect it.

Have a look at https://3v4l.org/RCrRd

Apart from that you are calling an instance-method as a static method by
using A::test().


This appears to be the crucial thing: if you declare the test() method 
as static in both classes, it returns false in all versions: 
https://3v4l.org/hJoor


It's almost like A::test() is now interpreted as a static call, rather 
than a "scope resolution" of the instance method, but $this is still 
available, so it's not quite as simple as that: https://3v4l.org/qbT3j


Regards,
--
Rowan Collins
[IMSoP]




--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php