rfc:use_function
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:use_function [2013/07/19 16:26] – [Patches and Tests] igorw | rfc:use_function [2017/09/22 13:28] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: Importing namespaced functions ====== | ====== PHP RFC: Importing namespaced functions ====== | ||
- | * Version: | + | * Version: |
* Date: 2013-05-02 | * Date: 2013-05-02 | ||
* Author: Igor Wiedler, igor@wiedler.ch | * Author: Igor Wiedler, igor@wiedler.ch | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 70: | Line 70: | ||
var_dump(baz()); | var_dump(baz()); | ||
var_dump(qux()); | var_dump(qux()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | All of this applies not only to functions, but also to namespaced constants. For consistency, | ||
+ | |||
+ | <code php> | ||
+ | namespace foo\bar { | ||
+ | const baz = 42; | ||
+ | } | ||
+ | |||
+ | namespace { | ||
+ | use const foo\bar\baz; | ||
+ | var_dump(baz); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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); | ||
} | } | ||
</ | </ | ||
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" | ||
+ | |||
+ | 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:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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) [as a GitHub pull request](https:// | + | There is a patch against PHP-5.6 (currently master) [[https:// |
===== References ===== | ===== References ===== | ||
Line 165: | Line 227: | ||
- None. | - None. | ||
+ | |||
+ | ===== Vote ===== | ||
+ | |||
+ | The voting period is 15.08.2013 until 29.08.2013. | ||
+ | |||
+ | <doodle title=" | ||
+ | * Yes? | ||
+ | * No? | ||
+ | </ | ||
+ | ===== 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