Internal Type Juggling in PHP 5.2 vs PHP 5.3

There is an undocumented case where the output of an internal function is different in PHP 5.2 vs PHP 5.3 when you pass it an invalid argument.

For example, strlen returns different values and warnings/notices when attempting to pass it an array.


php 5.2 > var_dump(strlen(array()));
PHP Notice: Array to string conversion in php shell code on line 1

Notice: Array to string conversion in php shell code on line 1
int(5)


php 5.3 > var_dump(strlen(array()));
PHP Warning: strlen() expects parameter 1 to be string, array given in php shell code on line 1
PHP Stack trace:
PHP 1. {main}() php shell code:0
PHP 2. strlen() php shell code:1

Warning: strlen() expects parameter 1 to be string, array given in php shell code on line 1

Call Stack:
467.9296 320928 1. {main}() php shell code:0
467.9296 321072 2. strlen() php shell code:1

NULL


The E_WARNING and return value of NULL in PHP 5.3 is preferred, but I still wanted to know why PHP 5.2 was returning int(5). I tracked down the reason to this subversion commit and this patch.

In the above patch, I see that strlen and other functions(method_exists, property_exists, function_exists, strcmp, strncmp, strcasecmp, strncasecmp, defined, is_a_impl) were not using zend_parse_parameters to get the arguments. This was preventing the standard validations and warnings from running for that function. Also, those functions were incorrectly casting the arguments to string with convert_to_string_ex. That is why strlen() of array() is int(5); because, casting array() to string returns “Array”.

Now, in PHP 5.3, those functions will no longer coerce the arguments to strings, will return NULL, and will issue a warning when invalid arguments have been provided. Thanks stas.

Note:
There is an extra space between the words php and shell in this post since the string “php[SPACE]shell” causes ModSecurity to prevent me from saving this post.

Google Dictionary Discontinued

I used to link users to the definition of a word by using the following url:
http://www.google.com/dictionary?langpair=en|en&q=protean
As of August 5, 2011, going to that url just takes you to a discontinued page that says “Google Dictionary is no longer available. You can use Google web search to find definitions or Google Translate for your translation needs.”.

Google suggests that you use
define protean
to display the definition of the word above the search terms, but it doesn’t take the user directly to the full dictionary entry.

You can use this url to forward users to the full dictionary entry for a word.
http://www.google.com/#q=protean&tbs=dfn:1

The tbs query parameter affects what Search Tool is displayed. Here is a list of other values that are available for that parameter.

Search Tool tbs value
Sites with images img:1
Related searches clue:1
Timeline tl:1
Dictionary dfn:1
Reading level rl:1
Social frim:1
Nearby loc:n
Translated foreign pages clir:1