Please confirm behaviour of ZEND_ACC_STATIC

php.internals

l0t3k

22 years ago
in my extension, i have a class which has methods which work slightly differently depending on whether or not they are called statically. as an example : $original = new UnicodeString("HELLO WORLD","utf8"); $lower = UnicodeString::toLowerCase($original); /* returns a new copy */ $lower1 = $original->toLowerCase(); /* original is lowercased. return a reference */ the latter is for efficiency. imagine chains like print_r($original->reverse()->toTitleCase()->split(" ")); /* no intermediaries created work on $original*/ while the former allows for transformations without affecting the original string. since the method can behave statically, it is marked as ZEND_ACC_STATIC. however it appears that once marked as such, getThis() always reports NULL. i've confirmed that marking it as non static cause the object to be properly passed. is this a WAD. if so, is it possible (at least for internal functions) for a method to be called statically as well as in an object context ? l0t3k

Andrey Hristov

22 years ago
Quoting l0t3k <cshmoove@bellsouth.net>:
> in my extension, i have a class which has methods which work slightly > differently depending on whether or not they are called statically. > as an example : > > $original = new UnicodeString("HELLO WORLD","utf8"); > $lower = UnicodeString::toLowerCase($original); /* returns a new copy > */ > $lower1 = $original->toLowerCase(); /* original is lowercased. return a > reference */ > > the latter is for efficiency. imagine chains like > print_r($original->reverse()->toTitleCase()->split(" ")); /* no > intermediaries created work on $original*/ > > while the former allows for transformations without affecting the original > string. > > since the method can behave statically, it is marked as ZEND_ACC_STATIC. > however it appears that once marked as such, > getThis() always reports NULL. i've confirmed that marking it as non static > cause the object to be properly passed.
Yepp, I have experienced this and forced myself to add methodNameS (the S is for static) method to have static calls available.
> is this a WAD. if so, is it possible (at least for internal functions) for a > method to be called statically as well as in an object context ? > > l0t3k >
andrey

Marcus Börger

22 years ago
Hello l0t3k, never ever mix static and non static methods! The only reason this is possible is for having BC for old bullshit concepts. Apart from that use ZEND_ACC_ALLOW_STATIC if you really want that behavior but before you do think twice and again and then again if there is no correct way... marcus Friday, July 2, 2004, 3:50:18 PM, you wrote:
> in my extension, i have a class which has methods which work slightly > differently depending on whether or not they are called statically. > as an example :
> $original = new UnicodeString("HELLO WORLD","utf8"); > $lower = UnicodeString::toLowerCase($original); /* returns a new copy > */ > $lower1 = $original->toLowerCase(); /* original is lowercased. return a > reference */
> the latter is for efficiency. imagine chains like > print_r($original->reverse()->toTitleCase()->split(" ")); /* no > intermediaries created work on $original*/
> while the former allows for transformations without affecting the original > string.
> since the method can behave statically, it is marked as ZEND_ACC_STATIC. > however it appears that once marked as such, > getThis() always reports NULL. i've confirmed that marking it as non static > cause the object to be properly passed.
> is this a WAD. if so, is it possible (at least for internal functions) for a > method to be called statically as well as in an object context ?
> l0t3k
-- Best regards, Marcus mailto:helly@php.net