rfc:use_function
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:use_function [2013/05/02 21:03] – Minor rewording igorw | rfc:use_function [2013/08/29 14:28] – [Vote] close the vote igorw | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== PHP RFC: use function | + | ====== 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 is beyond the scope of this RFC. | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 153: | Line 219: | ||
===== Patches and Tests ===== | ===== Patches and Tests ===== | ||
- | None yet. | + | There is a patch against PHP-5.6 (currently master) [[https:// |
===== References ===== | ===== References ===== | ||
Line 162: | 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