Annotation of embedaddon/php/README.namespaces, revision 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>