Hello Marco,

Thursday, March 27, 2008, 9:25:48 AM, you wrote:

> Hi,

> i noticed that some changes was made that 100% break all apps that do such
> stuff:

> class x extends y
> {
>     public static function foo()
>     {
>         new self();
>     }
> }

> class y
> {
>     private function __construct()
>     {
>         echo 'y::__construct()' . PHP_EOL;
>     }
> }

> x::foo();

> with php 5.2.5 i works so that i get an output "y::__construct()" but with
> 5.2.6RC and -DEV
> it throws an fatal error:

> Fatal error: Call to private y::__construct() from context 'x'

The behavior is correct. Maybe something with $this is broken in earlier
versions. I checked the basic issue here calling an inherited private
constructor directly without anything else involved:

[EMAIL PROTECTED] PHP_5_0]$ php -r 'class R{private function __construct(){}} 
class D extends R{} new D;'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from context '' in Command line 
code on line 1
[EMAIL PROTECTED] PHP_5_0]$ cd ../PHP_5_1
[EMAIL PROTECTED] PHP_5_1]$ php -r 'class R{private function __construct(){}} 
class D extends R{} new D;'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from context '' in Command line 
code on line 1
[EMAIL PROTECTED] PHP_5_1]$ cd ../PHP_5_2
[EMAIL PROTECTED] PHP_5_2]$ php -r 'class R{private function __construct(){}} 
class D extends R{} new D;'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from invalid context in Command 
line code on line 1
[EMAIL PROTECTED] PHP_5_2]$ cd ../PHP_5_3
[EMAIL PROTECTED] PHP_5_3]$ php -r 'class R{private function __construct(){}} 
class D extends R{} new D;'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from invalid context in Command 
line code on line 1
[EMAIL PROTECTED] php-cvs]$ cd ../php-cvs
[EMAIL PROTECTED] php-cvs]$ php -r 'class R{private function __construct(){}} 
class D extends R{} new D;'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from invalid context in Command 
line code on line 1

Apparently all of 5.0, 5.1, 5.2, 5.3 and HEAD behave in the same way and issue a
Fatal error as expected.

Now your code uses self winthin class X which is derived from Y which has a
private constructor. Let's see whether the ctor is illegally called in this
example:

[EMAIL PROTECTED] PHP_5_0]$ cd ../PHP_5_0
[EMAIL PROTECTED] PHP_5_0]$ php -r 'class R{private function __construct(){echo 
"R\n";}} class D extends R{static function f(){var_dump(new self);}} D::f();'
make: `sapi/cli/php' is up to date.
R
object(D)#1 (0) {
}
[EMAIL PROTECTED] PHP_5_0]$ cd ../PHP_5_1
[EMAIL PROTECTED] PHP_5_1]$ php -r 'class R{private function __construct(){echo 
"R\n";}} class D extends R{static function f(){var_dump(new self);}} D::f();'
make: `sapi/cli/php' is up to date.
R
object(D)#1 (0) {
}
[EMAIL PROTECTED] PHP_5_1]$ cd ../PHP_5_2
[EMAIL PROTECTED] PHP_5_2]$ php -r 'class R{private function __construct(){echo 
"R\n";}} class D extends R{static function f(){var_dump(new self);}} D::f();'
make: `sapi/cli/php' is up to date.

Fatal error: Call to private R::__construct() from context 'D' in Command line 
code on line 1

So yes, there is a bug with the inheritance rules in older versions.

> i can remember that i asked a related question last year and someone told me
> it is ok so and its a know behavior.
> This change will ie. break ZF too. Any suggestions to this behavior?

Fix the code by finding the correct way that works with both old and new
versions.

Best regards,
 Marcus


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

Reply via email to