Conditional class definition in PHP 4.3.x

php.internals

Marcus Börger

22 years ago
Hello internals, version 5 does neither support nested classes nor conditional classes. Not supporting the former is a bit of a loss but the latter leads to ugly software design so no worry here. Anyway i tried the test script with 4.3.5-dev and there conditional classes are present but not working. Hence i suggest we disable or fix them. Further more i think we cannot fix it becasue the script mixes compile time and run time. It tries something like selfmodifying code. Since i think it is ugly software design anyways i am pro disabling. marcus@zaphod /usr/src/PHP_4_3_0 $ php -r 'if (1) {class a{function f(){return 1;}}}else{class a{function f(){return 0;}}}echo a::f()."\n";' 0 marcus@zaphod /usr/src/PHP_4_3_0 $ php -r 'if (0) {class a{function f(){return 1;}}}else{class a{function f(){return 0;}}}echo a::f()."\n";' 0
-- Best regards, Marcus mailto:helly@php.net

Christian Schneider

22 years ago
Marcus Boerger wrote:
> Further more i think we cannot fix it becasue the script mixes compile > time and run time. It tries something like selfmodifying code.
I agree that it should be disabled. If someone really, really wants to do it they can still include/eval conditionally. - Chris

Marcus Börger

22 years ago
Hello Christian, Monday, January 5, 2004, 3:58:22 PM, you wrote:
> Marcus Boerger wrote: >> Further more i think we cannot fix it becasue the script mixes compile >> time and run time. It tries something like selfmodifying code.
> I agree that it should be disabled. If someone really, really wants to > do it they can still include/eval conditionally.
And in php 5 one can use the __autoload() feature which is the correct choice for such designs where classes are optional.
-- Best regards, Marcus mailto:helly@php.net

Andi Gutmans

22 years ago
This is strange. I remember it used to work. We'll look into it. Andi At 03:37 PM 1/5/2004 +0100, Marcus Boerger wrote:

Alan Knowles

22 years ago
This only affects single line conditional class and function declarations. php -r ' if (1) { function test () { echo "1"; }} else { function test() { echo "0"; }} test();' It affects php4.3.2 and up. (and probably alot earlier....) if you lay this out in a file, it works perfectly: eg. <?php if (1) { function test () { echo "1"; } } else { function test() { echo "0"; } } test(); I think the fix in here should be ok for conditional classes / nested class issue... http://bugs.php.net/26760 Not sure if the above is a critical case.. - but it was a bit supprising... Regards Alan Andi Gutmans wrote:

Zeev Suraski

22 years ago
At 18:58 06/01/2004, Alan Knowles wrote:
>This only affects single line conditional class and function declarations. > >php -r ' if (1) { function test () { echo "1"; }} else { function >test() { echo "0"; }} test();' > >It affects php4.3.2 and up. (and probably alot earlier....)
Wow, that's a neat one. Took me a while to realize what the heck is going on, but basically it has to do with the way the engine mangles function/class names. It's based on the file name and the line number. This *usually* works, practically, it always works except for when using -r (which probably didn't exist at the time we introduced this mangling... Anyway, I'll look into fixing it. Thanks for pinpointing the problem! Zeev

Johannes Schlueter

22 years ago
Hi, Zeev Suraski wrote:
> Wow, that's a neat one. Took me a while to realize what the heck is > going on, but basically it has to do with the way the engine mangles > function/class names. It's based on the file name and the line number. > This *usually* works, practically, it always works except for when using > -r (which probably didn't exist at the time we introduced this mangling... > > Anyway, I'll look into fixing it. Thanks for pinpointing the problem!
Might #26456 be caused by the same problem? Then it also affects the PHP5/ZE2 branch. http://bugs.php.net/bug.php?id=26456 johannes

Andi Gutmans

22 years ago
I fixed this problem. I agree it's not great coding but there's no real reason to break BC on this issue. I also fixed the problem with conditional function declerations being on the same line. Andi At 03:37 PM 1/5/2004 +0100, Marcus Boerger wrote: