rfc:use_function

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
rfc:use_function [2013/07/19 16:28] – [Patches and Tests] igorwrfc:use_function [2013/12/06 10:27] – update status to Implemented igorw
Line 1: Line 1:
 ====== PHP RFC: Importing namespaced functions ====== ====== PHP RFC: Importing namespaced functions ======
  
-  * Version: 0.1+  * Version: 1.1.1
   * Date: 2013-05-02   * Date: 2013-05-02
   * Author: Igor Wiedler, igor@wiedler.ch   * Author: Igor Wiedler, igor@wiedler.ch
-  * Status: Draft+  * Status: Implemented (PHP-5.6)
   * First Published at: http://wiki.php.net/rfc/use_function   * First Published at: http://wiki.php.net/rfc/use_function
  
Line 70: Line 70:
     var_dump(baz());     var_dump(baz());
     var_dump(qux());     var_dump(qux());
 +}
 +</code>
 +
 +All of this applies not only to functions, but also to namespaced constants. For consistency, a **use const** sequence should also be introduced, that does the same thing for constants:
 +
 +<code php>
 +namespace foo\bar {
 +    const baz = 42;
 +}
 +
 +namespace {
 +    use const foo\bar\baz;
 +    var_dump(baz);
 +}
 +</code>
 +
 +Just like classes, it should be possible to alias imported functions and constants:
 +
 +<code php>
 +namespace {
 +    use function foo\bar as foo_bar;
 +    use const foo\BAZ as FOO_BAZ;
 +    var_dump(foo_bar());
 +    var_dump(FOO_BAZ);
 } }
 </code> </code>
Line 122: Line 146:
  
 The call to **strlen** is no longer ambiguous. **non_existent** is no longer looked up in the global namespace. The call to **strlen** is no longer ambiguous. **non_existent** is no longer looked up in the global namespace.
 +
 +==== Why is "use function" needed instead of just "use"? ====
 +
 +In PHP, functions and classes are stored in separate namespaces. A function `foo\bar` and a class `foo\bar` can co-exist, because it is possible to infer from the context if the symbol is used as a class or a function:
 +
 +<code php>
 +namespace foo {
 +    function bar() {}
 +    class bar {}
 +}
 +
 +namespace {
 +    foo\bar(); // function call
 +    new foo\bar(); // class instantiation
 +    foo\bar::baz(); // static method call on class
 +}
 +</code>
 +
 +If **use** were changed to support functions as well, it would introduce BC breaks.
 +
 +An example:
 +
 +<code php>
 +namespace {
 +    function bar() {}
 +}
 +
 +namespace foo {
 +    function bar() {}
 +}
 +
 +namespace {
 +    use foo\bar;
 +    bar();
 +}
 +</code>
 +
 +The behaviour changed, when **use** was changed. Depending on your PHP version, a different function will be called.
  
 ==== Function autoloading ==== ==== Function autoloading ====
Line 157: Line 219:
 ===== Patches and Tests ===== ===== Patches and Tests =====
  
-There is a patch against PHP-5.6 (currently master) [[https://github.com/php/php-src/pull/388|as a GitHub pull request]].+There is a patch against PHP-5.6 (currently master) [[https://github.com/php/php-src/pull/526|as a GitHub pull request]].
 ===== References ===== ===== References =====
  
Line 165: Line 227:
  
 - None. - None.
 +
 +===== Vote =====
 +
 +The voting period is 15.08.2013 until 29.08.2013.
 +
 +<doodle title="RFC/use_function" auth="user" voteType="multi" closed="true">
 +   * Yes?
 +   * No?
 +</doodle>
 +===== Changelog =====
 +
 +  * 2013-08-08 1.1.1 Added example of aliasing
 +  * 2013-07-23 1.1.0 Added support for constants with `use const`
 +  * 2013-07-22 1.0.1 FAQ "why 'use function'?"
 +  * 2013-07-19 1.0.0 First version published for discussion
rfc/use_function.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1