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>