On 1/22/2019 1:34 PM, Girgias wrote:
Greetings PHP internals,
After skimming through the PHP documentation, I came up with a list of
functions which seem
reasonable to deprecate as of PHP 8 and I would like to gather some
opinions from Internals.
If this seems like it's too early or should be in an RFC draft please let
me know and in case it
needs an RFC may I have Karma to do so.
Without further ado here is the list I compiled:
I've run a set of searches against GitHub code repos.
The numbers below are just generic metrics of usage and reloading search
result pages caused result counts to vary extremely widely. I didn't
look too in-depth at each result set beyond getting a number and a
general feel.
PHP Info/Option functions:
- php_sapi_name (use PHP_SAPI constant)
https://github.com/search?l=PHP&o=desc&q=php_sapi_name&s=indexed&type=Code
https://github.com/search?l=PHP&o=desc&q=PHP_SAPI&s=indexed&type=Code
1.02 million vs. 2.0 million code references. Both in active use.
- phpversion (use PHP_VERSION constant)
https://github.com/search?l=PHP&o=desc&q=phpversion&s=indexed&type=Code
https://github.com/search?l=PHP&o=desc&q=PHP_VERSION&s=indexed&type=Code
2.78 million vs. 5.1 million* code references.
* Unfortunately, WordPress uses a variable called $php_version, which
throws off the global count.
WordPress itself uses phpversion(). That's 30% of all websites.
- php_uname (use PHP_OS constant)
No. PHP_OS only covers one option that php_uname() exposes. Simple
searches are turning up plenty of other php_uname() options in use.
Classes/Objects functions:
- is_a (use instanceof operator)
https://github.com/search?l=PHP&o=desc&q=is_a&s=indexed&type=Code
https://github.com/search?l=PHP&o=desc&q=instanceof&s=indexed&type=Code
1.7 million vs. 28.4 million results.
is_a() is still seeing some use but most people are using instanceof.
Also, $allow_string describes "This also prevents from calling
autoloader if the class doesn't exist." No equivalent functionality
exists without this function.
- is_subclass_of (not exactly what it's purpose is but the instanceof
operator SHOULD be a valid equivalence with another condition if the same
class must not be used)
https://github.com/search?l=PHP&o=desc&q=is_subclass_of&s=indexed&type=Code
1.54 million results.
In addition to the notes above about is_a(), CodeIgniter appears to use
this function.
Function handling functions:
- call_user_func (invoke directly)
https://github.com/search?l=PHP&o=desc&q=call_user_func&s=indexed&type=Code
10 million results. Broad, active usage.
Also, there are scenarios where you can't always invoke directly as you
claim. Been there, done that myself.
- call_user_func_array (arguments can be provided with the splat
operator (...) as of PHP 5.6
https://github.com/search?l=PHP&o=desc&q=call_user_func_array&s=indexed&type=Code
11.4 million results (and breaks GitHub search for me in a unique way
I've not seen before). Broad, active usage.
See above.
- forward_static_call (same reason as call_user_func)
https://github.com/search?l=PHP&o=desc&q=forward_static_call&s=indexed&type=Code
52,200 results.
Can probably be deprecated.
- forward_static_call_array (same reason as call_user_func_array)
https://github.com/search?l=PHP&o=desc&q=forward_static_call_array&s=indexed&type=Code
14,581 results.
Can probably be deprecated.
- func_get_arg (seems unnecessary as of PHP 5.6 with variadic functions
(splat operator))
https://github.com/search?l=PHP&o=desc&q=func_get_arg&s=indexed&type=Code
1.1 million results.
While I personally never saw the point of this function since
func_get_args() exists, func_get_arg() sees regular use.
- func_get_args (same reason as func_get_arg)
https://github.com/search?l=PHP&o=desc&q=func_get_args&s=indexed&type=Code
9.2 million results.
Oh, and the first search result that turned up for me looks fun:
https://github.com/phonetworks/graphjs-server/blob/94d4a672e12a3b0b7626d8c74110b72f44d564c7/src/GraphJS/Router.php
self::initSession(...\func_get_args());
An elegant (and yet slightly horrifying) one-liner crushes whatever
argument you seemed to have about the splat operator: The author used both.
- func_num_args (same reason as func_get_arg)
https://github.com/search?l=PHP&o=desc&q=func_num_args&s=indexed&type=Code
3.35 million results.
Variable handling functions:
Aliases:
- is_double
https://github.com/search?l=PHP&o=desc&q=is_double&s=indexed&type=Code
345,700 results. Seems to be used for unit testing code bits verifying
return types.
- is_integer
https://github.com/search?l=PHP&o=desc&q=is_integer&s=indexed&type=Code
1 million results.
- is_long
https://github.com/search?l=PHP&o=desc&q=is_long&s=indexed&type=Code
95,400 results.
- is_real (already in the deprecation draft for PHP 7.4)
https://github.com/search?l=PHP&o=desc&q=is_real&s=indexed&type=Code
54,364 results. But not even the first page of results for me shows a
single call to it. Can be deprecated.
Setting var type (can use variable casting nowadays):
- boolval
https://github.com/search?l=PHP&o=desc&q=boolval&s=indexed&type=Code
54,400 results.
- doubleval
https://github.com/search?l=PHP&o=desc&q=doubleval&s=indexed&type=Code
214,200 results.
- floatval
https://github.com/search?l=PHP&o=desc&q=floatval&s=indexed&type=Code
1.7 million results.
- intval (for arbitrary base change there exists the math function
base_convert)
https://github.com/search?l=PHP&o=desc&q=intval&s=indexed&type=Code
13.65 million results.
- strval
https://github.com/search?l=PHP&o=desc&q=strval&s=indexed&type=Code
2.4 million results.
I'm not in favor of removal of these functions. While *I* don't use
them, lots of people still use them in conjunction with array_map() and
similar callback-oriented functions. I'd rather see them be optimized
within specific contexts such as array_map() for significantly improved
performance *first* before recommending deprecation.
- settype
https://github.com/search?l=PHP&o=desc&q=settype&s=indexed&type=Code
4.1 million results. However, most results seem to be classes with a
method called setType(), so those throw off an accurate global count.
There is an interesting usage here:
https://github.com/isaiassm/treinaweb-laravel-blade/blob/576448cd6a061b42c4742f490e2d771b5bd127b2/vendor/phpunit/phpunit/src/Util/Xml.php
\settype($variable, $element->tagName);
Which I assume is for something like deserialization from XML.
- gettype (more on this later [1])
https://github.com/search?l=PHP&o=desc&q=gettype&s=indexed&type=Code
9.3 million results. However, most results seem to be classes with a
method called getType(), so those again throw off an accurate global count.
String functions aliases:
- chop (alias of rtrim)
https://github.com/search?l=PHP&o=desc&q=chop&s=indexed&type=Code
562,200 results. Mostly comments about chopping up strings using
substr(). Found a few legitimate usages such as Parsedown.
- join (alias of implode)
Impossible to determine. JOIN in SQL is severely skewing results.
- strchr (alias of strstr)
https://github.com/search?l=PHP&o=desc&q=strchr&s=indexed&type=Code
104,600 results.
Maths functions aliases:
- getrandmax
Shouldn't that have a comment like "(use mt_getrandmax() instead)"?
- rand (use mt_rand instead)
- srand (alias of mt_srand as of PHP 7.1)
Most usages from searches seem to be using the mt_...() functions
already anyway.
Filesystem aliases:
- diskfreespace — Alias of disk_free_space
https://github.com/search?l=PHP&o=desc&q=diskfreespace&s=indexed&type=Code
17,400 results. Can probably be deprecated.
- fputs — Alias of fwrite
https://github.com/search?l=PHP&o=desc&q=fputs&s=indexed&type=Code
1.2 million results. Seems to be in active use.
- is_writeable — Alias of is_writable
https://github.com/search?l=PHP&o=desc&q=is_writeable&s=indexed&type=Code
https://github.com/search?l=PHP&o=desc&q=is_writable&s=indexed&type=Code
629,500 vs. 3.65 million results.
(On Google: 1.19 million vs. 6.2 million results for the words
writeable vs. writable.)
Deprecating this alias seems petty. Users currently don't have to look
up the function at the moment. Removing the alias will cause EVERYONE
to look up the function to be sure they remember how to correctly spell
it to avoid the deprecation warning.
- set_file_buffer — Alias of stream_set_write_buffer
https://github.com/search?l=PHP&o=desc&q=set_file_buffer&s=indexed&type=Code
https://github.com/search?l=PHP&o=desc&q=stream_set_write_buffer&s=indexed&type=Code
15,700 vs. 61,100 results.
Of the 15,700 results, I see only a couple of function usages in the
first few pages of results. Can probably be deprecated.
Old signatures:
- implode (historical signature)
Impossible to run a search for this.
Controversial idea:
- deprecate array function creation (array())
https://github.com/search?l=PHP&o=desc&q=array&s=indexed&type=Code
71.1 million results.
No.
Also, array() is not a function. It's a keyword with performance on-par
with [].
http://php.net/manual/en/reserved.keywords.php
I also prefer array() over []. It's more readable because it uses a
*word* rather than unsearchable symbols to define a structure.
Also, I get that arrays not actually implemented as such behind the
scenes but you simply can't deprecate an estimated 70 million lines of
code globally (and that's the code you can see, not including internal
software everywhere). "Hi, for PHP 8, we are going to fill your hard
drives via your application logs with deprecation warnings and crash
your servers. Have fun sorting that mess out!"
Finally, barring a serious security vulnerability, keywords should be
viewed as permanent fixtures of the language. They can't be deprecated.
That's why there are so few keywords. Far too much userland code will
unnecessarily break. You suggest deprecating 'array' but not
'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile'.
All of those have alternative "shortcuts" but you didn't mention
deprecating those keywords even though there is far less usage compared
to 'array'.
Just to remind these are only ideas and feedback is wholeheartedly
welcomed. I also probably
missed some more functions which could be deprecated as of PHP 8 but I feel
this covers
already a large portion.
Best regards
George P. Banyard
--
Thomas Hruska
CubicleSoft President
I've got great, time saving software that you will find useful.
http://cubiclesoft.com/
And once you find my software useful:
http://cubiclesoft.com/donate/
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php