Annotation of embedaddon/php/README.namespaces, revision 1.1.1.1

1.1       misho       1: Design
                      2: ======
                      3: 
                      4: Main assumption of the model is that the problem that we are to solve is the
                      5: problem of the very long class names in PHP libraries. We would not attempt
                      6: to take autoloader's job or create packaging model - only make names
                      7: manageable.
                      8: 
                      9: Namespaces are defined the following way:
                     10: 
                     11: Zend/DB/Connection.php:
                     12: <?php
                     13: namespace Zend\DB;
                     14: 
                     15: class Connection {
                     16: }
                     17: 
                     18: function connect() {
                     19: }
                     20: ?>
                     21: 
                     22: Namespace definition does the following:
                     23: All class and function names inside are automatically prefixed with
                     24: namespace name. Inside namespace, local name always takes precedence over
                     25: global name. Several files may be using the same namespace.
                     26: The namespace declaration statement must be the very first statement in
                     27: the file. The only exception is "declare" statement that can be used before.
                     28: 
                     29: Every class and function in a namespace can be referred to by the full name
                     30: - e.g. Zend\DB\Connection or Zend\DB\connect - at any time.
                     31: 
                     32: <?php
                     33: require 'Zend/Db/Connection.php';
                     34: $x = new Zend\DB\Connection;
                     35: Zend\DB\connect();
                     36: ?>
                     37: 
                     38: Namespace or class name can be imported:
                     39: 
                     40: <?php
                     41: require 'Zend/Db/Connection.php';
                     42: use Zend\DB;
                     43: use Zend\DB\Connection as DbConnection;
                     44: 
                     45: $x = new Zend\DB\Connection();
                     46: $y = new DB\connection();
                     47: $z = new DbConnection();
                     48: DB\connect();
                     49: ?>
                     50: 
                     51: The use statement only defines name aliasing. It may create name alias for
                     52: namespace or class. The simple form of statement "use A\B\C\D;" is
                     53: equivalent to "use A\B\C\D as D;". The use statement can be used at any
                     54: time in the global scope (not inside function/class) and takes effect from 
                     55: the point of definition down to the end of file. It is recommended however to
                     56: place the use statements at the beginning of the file. The use statements have
                     57: effect only on the file where they appear.
                     58: 
                     59: The special "empty" namespace (\ prefix) is useful as explicit global
                     60: namespace qualification. All class and function names started from \
                     61: interpreted as global.
                     62: 
                     63: <?php 
                     64: namespace A\B\C;
                     65: 
                     66: $con = \mysql_connect(...);
                     67: ?>
                     68: 
                     69: A special constant __NAMESPACE__ contains the name of the current namespace. 
                     70: It can be used to construct fully-qualified names to pass them as callbacks.
                     71: 
                     72: <?php
                     73: namespace A\B\C;
                     74: 
                     75: function foo() {
                     76: }
                     77: 
                     78: set_error_handler(__NAMESPACE__ . "\foo");
                     79: ?>
                     80: 
                     81: In global namespace __NAMESPACE__ constant has the value of empty string.
                     82: 
                     83: Names inside namespace are resolved according to the following rules:
                     84: 
                     85: 1) all qualified names are translated during compilation according to
                     86: current import rules. So if we have "use A\B\C" and then "C\D\e()"
                     87: it is translated to "A\B\C\D\e()".
                     88: 2) unqualified class names translated during compilation according to
                     89: current import rules. So if we have "use A\B\C" and then "new C()" it
                     90: is translated to "new A\B\C()".
                     91: 3) inside namespace, calls to unqualified functions that are defined in 
                     92: current namespace (and are known at the time the call is parsed) are 
                     93: interpreted as calls to these namespace functions.
                     94: 4) inside namespace, calls to unqualified functions that are not defined 
                     95: in current namespace are resolved at run-time. The call to function foo() 
                     96: inside namespace (A\B) first tries to find and call function from current 
                     97: namespace A\B\foo() and if it doesn't exist PHP tries to call internal
                     98: function foo(). Note that using foo() inside namespace you can call only 
                     99: internal PHP functions, however using \foo() you are able to call any
                    100: function from the global namespace.
                    101: 5) unqualified class names are resolved at run-time. E.q. "new Exception()"
                    102: first tries to use (and autoload) class from current namespace and in case 
                    103: of failure uses internal PHP class. Note that using "new A" in namespace 
                    104: you can only create class from this namespace or internal PHP class, however
                    105: using "new \A" you are able to create any class from the global namespace.
                    106: 6) Calls to qualified functions are resolved at run-time. Call to
                    107: A\B\foo() first tries to call function foo() from namespace A\B, then
                    108: it tries to find class A\B (__autoload() it if necessary) and call its
                    109: static method foo()
                    110: 7) qualified class names are interpreted as class from corresponding
                    111: namespace. So "new A\B\C()" refers to class C from namespace A\B.
                    112: 
                    113: Examples
                    114: --------
                    115: <?php
                    116: namespace A;
                    117: foo();   // first tries to call "foo" defined in namespace "A"
                    118:          // then calls internal function "foo"
                    119: \foo(); // calls function "foo" defined in global scope
                    120: ?>
                    121: 
                    122: <?php
                    123: namespace A;
                    124: new B();   // first tries to create object of class "B" defined in namespace "A"
                    125:            // then creates object of internal class "B"
                    126: new \B(); // creates object of class "B" defined in global scope
                    127: ?>
                    128: 
                    129: <?php
                    130: namespace A;
                    131: new A(); // first tries to create object of class "A" from namespace "A" (A\A)
                    132:          // then creates object of internal class "A"
                    133: ?>
                    134: 
                    135: <?php
                    136: namespace A;
                    137: B\foo();   // first tries to call function "foo" from namespace "A\B"
                    138:             // then calls method "foo" of internal class "B"
                    139: \B\foo(); // first tries to call function "foo" from namespace "B"
                    140:             // then calls method "foo" of class "B" from global scope
                    141: ?>
                    142: 
                    143: The worst case if class name conflicts with namespace name
                    144: <?php
                    145: namespace A;
                    146: A\foo();   // first tries to call function "foo" from namespace "A\A"
                    147:             // then tries to call method "foo" of class "A" from namespace "A"
                    148:             // then tries to call function "foo" from namespace "A"
                    149:             // then calls method "foo" of internal class "A"
                    150: \A\foo(); // first tries to call function "foo" from namespace "A"
                    151:             // then calls method "foo" of class "A" from global scope
                    152: ?>
                    153: 
                    154: TODO
                    155: ====
                    156: 
                    157: * Support for namespace constants?
                    158: 
                    159: * performance problems
                    160:   - calls to internal functions in namespaces are slower, because PHP first
                    161:     looks for such function in current namespace
                    162:   - calls to static methods are slower, because PHP first tries to look
                    163:     for corresponding function in namespace
                    164: 
                    165: * Extend the Reflection API?
                    166:   * Add ReflectionNamespace class
                    167:     + getName()
                    168:     + getClasses()
                    169:     + getFunctions()
                    170:     + getFiles()
                    171:   * Add getNamespace() methods to ReflectionClass and ReflectionFunction
                    172: 
                    173: * Rename namespaces to packages?
                    174: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>