rfc:namespaces
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:namespaces [2008/09/15 10:57] – tweak jochem | rfc:namespaces [2008/09/16 00:07] – tweak jochem | ||
---|---|---|---|
Line 41: | Line 41: | ||
- 5. Importing NameSpace:: | - 5. Importing NameSpace:: | ||
- 6. **Static methods v. namespaced function ambiguities** | - 6. **Static methods v. namespaced function ambiguities** | ||
- | - 7. **Class constants v. constants ambiguities** | + | - 7. **Class constants v. namespaced |
- 8. use and includes | - 8. use and includes | ||
- 9. **Importing functions** | - 9. **Importing functions** | ||
Line 57: | Line 57: | ||
+ | ---- | ||
==== 2. define() & defined() ==== | ==== 2. define() & defined() ==== | ||
Line 222: | Line 223: | ||
+ | ---- | ||
==== 3. Autoload & functions ==== | ==== 3. Autoload & functions ==== | ||
Line 328: | Line 330: | ||
+ | ---- | ||
==== 4. You can ' | ==== 4. You can ' | ||
Line 389: | Line 392: | ||
+ | ---- | ||
==== 5. Importing NameSpace:: | ==== 5. Importing NameSpace:: | ||
Line 443: | Line 447: | ||
+ | ---- | ||
==== 6. Static methods/ | ==== 6. Static methods/ | ||
+ | There is an abiguity, from the users point of view between static class method calls and namespaced function calls, essentially it is very difficult to determine (if at all) from the code, even given context, whether **TEST:: | ||
+ | class.inc: | ||
+ | <code php> | ||
+ | <?php | ||
+ | class TEST { | ||
+ | static function what() | ||
+ | static function where() { echo __FUNCTION__," | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ns.inc: | ||
+ | <code php> | ||
+ | <?php | ||
+ | namespace TEST; | ||
+ | function what() { echo __FUNCTION__," | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | example1.php: | ||
+ | <code php> | ||
+ | <?php | ||
+ | include ' | ||
+ | include ' | ||
+ | TEST:: | ||
+ | TEST:: | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | output of example1.php (regardless of include order): | ||
+ | < | ||
+ | TEST::what in namespace | ||
+ | where in class | ||
+ | </ | ||
+ | |||
+ | There is no way to reference the static method **TEST:: | ||
+ | |||
+ | //There is a need to disambiguate these two calls, and to be able to call both regardless of the existence of the other.// | ||
+ | ---- | ||
==== 7. Class constants v. constants ambiguities ==== | ==== 7. Class constants v. constants ambiguities ==== | ||
+ | The same ambiguity that exists between static methods and namespaced functions also exists between class constants and namespaced constants. | ||
+ | From the users point of view it not possible to determine, with any easy or certainty, from the code whether **TEST:: | ||
+ | class.inc: | ||
+ | <code php> | ||
+ | <?php | ||
+ | class TEST { | ||
+ | const MY_CNST_ONE = 'TEST class CONSTANT ONE'; | ||
+ | const MY_CNST_TWO = 'TEST class CONSTANT TWO'; | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | ns.inc: | ||
+ | <code php> | ||
+ | <?php | ||
+ | namespace TEST; | ||
+ | const MY_CNST_ONE = 'TEST class CONSTANT ONE'; | ||
+ | ?> | ||
+ | |||
+ | example1.php: | ||
+ | <code php> | ||
+ | <?php | ||
+ | include ' | ||
+ | include ' | ||
+ | echo TEST:: | ||
+ | echo TEST:: | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | output of example1.php (regardless of include order): | ||
+ | < | ||
+ | TEST namespace CONSTANT ONE | ||
+ | TEST class CONSTANT TWO | ||
+ | </ | ||
+ | |||
+ | There is no way to reference the constant **MY_CNST_ONE** from class **TEST**, additionally because constant **MY_CNST_TWO** from class **TEST** is reachable one is left with the potential that the namespaced include will break current code if a constant **MY_CNST_TWO** is later defined in the TEST namespace, regardless it introduces confusion because one is it possible to retrieve constants from two different ' | ||
+ | |||
+ | //There is a need to disambiguate the constants, and to be able to reference both regardless of the existence of the other.// | ||
+ | |||
+ | |||
+ | ---- | ||
==== 8. **use** and includes ==== | ==== 8. **use** and includes ==== | ||
Line 468: | Line 552: | ||
+ | |||
+ | ---- | ||
==== 9. Importing functions ==== | ==== 9. Importing functions ==== | ||
+ | It is not currently possible to alias namespaced functions, making them inconsistent with namespaced classes, and forcing users that are working with namespaced functions to always prefix namespaced functions in order to use them. This seems like an artificial limitation that implies functions are a second-class after thought as far as namespaces are concerned, additionally php has never before dictated to users an **OO** over **procedural** style of coding, the current implementation of namespaces seems to imply that **OO** is inherently better. | ||
+ | |||
+ | It is therefore not possible to override built in functions with functions imported from a namespace, which some people has expressed a desire to do ... most notably in the context of template engines, which generally strive to hide as much of the php's syntax from template developers [who generally don't program php] even though the template engine actually uses php syntax/code to expose it's functionality) ... forcing template developers to learn the intricacies of prefixing functions they employ (and there by having to realise that these may clash with static methods!) creates an unnecessary burden. | ||
+ | |||
+ | Regardless, it should be possible to import a namespaced function into the current file and use it in the same way one has been accustomed to calling functions. | ||
+ | The following examples tries to demonstrate the issue: | ||
+ | |||
+ | ns_funcs.inc: | ||
+ | <code php> | ||
+ | <?php | ||
+ | namespace MY:: | ||
+ | function foo() { echo "Hello World!\n"; | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | example1.php: | ||
+ | <code php> | ||
+ | <?php | ||
+ | include ' | ||
+ | // use MY:: | ||
+ | use MY:: | ||
+ | NS::foo(); | ||
+ | MY:: | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | output from example1.php: | ||
+ | < | ||
+ | Hello World! | ||
+ | Hello World! | ||
+ | </ | ||
+ | |||
+ | example2.php: | ||
+ | <code php> | ||
+ | <?php | ||
+ | include ' | ||
+ | use MY:: | ||
+ | foo(); | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | output from example2.php: | ||
+ | < | ||
+ | Fatal error: Call to undefined function foo() in < | ||
+ | </ | ||
+ | |||
+ | ---- | ||
==== 10. Name resolution order ==== | ==== 10. Name resolution order ==== | ||
+ | |||
+ | ---- | ||
==== 11. Keywords in namespace names ==== | ==== 11. Keywords in namespace names ==== | ||
Line 544: | Line 679: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
==== 12. Namespace must be first declaration in file ==== | ==== 12. Namespace must be first declaration in file ==== | ||
Line 592: | Line 731: | ||
</ | </ | ||
- | ==== 12. Namespaces aren't implemented like in ... ==== | + | |
+ | |||
+ | ---- | ||
+ | |||
+ | ==== 13. Namespaces aren't implemented like in ... ==== | ||
PHP is not <insert your favorite language here>. Granted this is not an issue, but some of you reading this probably need something to smile about after reading the items above! | PHP is not <insert your favorite language here>. Granted this is not an issue, but some of you reading this probably need something to smile about after reading the items above! | ||
Line 672: | Line 815: | ||
This patch addresses the inability to include [html] output prior to the first **<? | This patch addresses the inability to include [html] output prior to the first **<? | ||
+ | To quote the author from his original post regarding this patch: | ||
+ | > This is a simple patch that allows files like this to work without parse error.: | ||
+ | > | ||
+ | > main.php: | ||
+ | > <code php> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | <?php | ||
+ | namespace my:: | ||
+ | |||
+ | // stuff | ||
+ | |||
+ | ?> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
===== Miscellaneous ===== | ===== Miscellaneous ===== | ||
Line 683: | Line 845: | ||
===== Discussions past & present ===== | ===== Discussions past & present ===== | ||
- | **//I will list a set of links to archives | + | Below is a list of links to internals@lists.php.net thread that discuss (amongst others things) namespaces, the list is in reverse chronological order (hopefully) based on the initial post to the given thread and only lists discussion that have occurred in 2008: |
+ | |||
+ | | ||
+ | | ||
+ | * [[php-internals@122118945204074|PATCH: | ||
+ | * [[php-internals@122118574632627|PATCH: | ||
+ | * [[php-internals@122126001625094|Please don't start 10 threads | ||
+ | * [[php-internals@122114969907530|Scoping | ||
+ | * [[php-internals@122110981102381|PATCH: | ||
+ | * [[php-internals@122098797532195|namespace function/ | ||
+ | * [[php-internals@122018993030061|namespace RFC]] | ||
+ | * [[php-internals@121920359817682|Namespace Global User Function Calls]] | ||
+ | * [[php-internals@121776665630615|Inconsistencies in 5.3]] | ||
+ | * [[php-internals@121626223101585|questions about namespaces, functions vs. closures]] | ||
+ | * [[php-internals@121615179414749|Include/ | ||
+ | * [[php-internals@121614847408006|Namespace problem? | ||
+ | * [[php-internals@121502894019535|towards a 5.3 release]] | ||
+ | * [[php-internals@121447143022557|How bad would it be to say/enforce that namespacing can only apply to classes | ||
+ | * [[php-internals@121397701404954|simple solution to another namespace conundrum? | ||
+ | * [[php-internals@121233666301819|multiple use]] | ||
+ | * [[php-internals@121223589228439|Alternative to multiple namespaces per file]] | ||
+ | * [[php-internals@121199212705823|Name resolution rules]] | ||
+ | * [[php-internals@121079120018378|5.3 Namespace resolution rules suggestions]] | ||
+ | * [[php-internals@121071258907404|5.3 and reflection]] | ||
+ | * [[php-internals@120742574008363|namespace implementation (irritating warning and autoload)]] | ||
+ | * [[php-internals@120613563032212|RFC: | ||
+ | * [[php-internals@120429739728318|PHP 5.3 Autoload+Namespaces+Functions incorret (atleast wierd) behaviour.]] | ||
+ | * [[php-internals@120018255502021|Namespace & Type Hinting Summaries? | ||
+ | * [[php-internals@119992382220241|Set default namespace]] | ||
+ | * [[php-internals@119874502923978|Suggestion: | ||
+ | |||
+ | //Nothing has been filtered on the basis of relevance BUT some threads may not be listed | ||
Line 691: | Line 884: | ||
the articles & blog posts listed here are (hopefully) in reverse chronological order, please note that older items may no longer be relevant as the implementation has changed since the time the item was published: | the articles & blog posts listed here are (hopefully) in reverse chronological order, please note that older items may no longer be relevant as the implementation has changed since the time the item was published: | ||
+ | - [[http:// | ||
- [[http:// | - [[http:// | ||
- [[http:// | - [[http:// |
rfc/namespaces.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1