管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
) M/ n, J1 Q$ o. S
+ G5 I* z' D4 A在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
2 P! t3 X7 C3 j& Z2 ^( A2 o0 U+ e+ ]
. y* L: O1 ]0 h) G+ n( e. f% ~6 b. q3 `* ?. \
我们来详细的讲解一下PHP中的命名空间:; }% W& C) p/ s( B$ W/ F. B
- s! O8 g! t7 c$ r9 [: o
语法:namespac_e 空间名\空间名; _% V/ W* ^" s) w5 e0 P, @/ e
7 m [' P6 h ?6 e; @ U
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- S- a1 B3 o5 {
# L- O* F- L7 }" w----------------------------------------------------------------------------+ h6 |3 Q# V, x A; k
R2 A7 C" x8 y/ y<php
0 M3 \, J ~4 \! z4 U
3 z' y' K. w+ A% P8 _namespoc_e AA;5 ?4 B* p7 i; [8 u
functio_n showInfo(){) Q. Z4 g$ j0 r
echo __METHOD__,'<br/>';
0 L! @8 r6 \! j1 H1 H8 w, S8 p/ e T}
$ o4 T4 y" |7 a& Q0 g7 Ushowinfo();
- e! J$ S0 L+ S3 W
2 m# u0 H) s3 x- i7 {3 nnamespoc_e AA\BB; W9 ]6 j3 m; z6 t" u7 u& d
! |, l, W( ?& J [
functio_n showInfo(){* l) W5 J8 N3 I$ o3 B9 s
echo __METHOD__,'<br/>';7 ?+ ^0 l) L: k! _: @
}
: {3 B, V' w; v; }//showInfo();
, M/ w9 l" T: y) |7 _ Z. V----------------------------------------------------------------------------5 C- ?+ d# y U! o0 R3 ]% Y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)% o1 i/ \; I0 p) f
/ ^( V$ M q* O$ p% w2 m
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。( j" o9 Y! D$ H
( d2 p/ P" i; f& i----------------------------------------------------------------------------
3 }& n8 Z: J& \/ A# E2 d/ K* {) v/ ^8 u2 L. k% b& |
<php
: r3 O# `' r, F8 s6 j+ inamespoc_e AA\BB;
. Z) ~8 G& h" |6 z X' efunctio_n showInfo(){& ?. t" R# l: O( [2 w9 M* h6 ?
echo __METHOD__,'<br/>';' {& m! i A: @9 n' F# c
}2 e; F6 k1 H$ L1 Y, W% M
namespoc_e CC;
- r$ w& {+ o! B8 g3 e8 { d1 dfunctio_n showInfo(){
" h) q- D9 z3 u3 c0 v echo __METHOD__,'<br/>';
* g# t! a$ G4 h; l}
" C; X. }, z ~% gnamespoc_e AA;
: x1 g* m7 E( pfunctio_n showInfo(){
" l4 v, a* k9 y: n# E3 U echo __METHOD__,'<br/>';2 O& e) V; ? `' r8 S) r3 C g
}# k' u+ w$ Q& @5 T8 r
//非限定访问:用于访问当前空间中的成员5 p! }2 T$ ^" q( X
showInfo();
, w1 Z6 c+ m6 `0 |2 J//限定访问:只能访问当前所在的空间的子空间中的成员
7 {3 C7 D' q4 b; VBB\showInfo();
- I, [& z; w: p: j7 R$ k0 F8 G6 K3 ~6 T//完全限定:可以访问其它所有的空间的成员
9 Y) p' t. H& ]# ?, T\CC\showInfo();8 i, U2 z+ d; @' Z- g( w. u
↑根空间标识符2 i4 [$ I* }. I& W' |- {5 Y9 }
----------------------------------------------------------------------------* `& A+ `+ |; Y! [# N
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:$ o& ]) f/ e6 x0 j* M: D
% ^ g# b5 M$ w7 i2 S
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 B3 ~' p8 b( ], V4 y& I
* X$ h; P" G N [( s
代码示例如下:
3 W, v0 D/ ~# T* T0 C& D6 O1 G& Y: }0 E. r
----------------------------------------------------------------------------1 E7 t' Q8 K& O1 R% A" b: S
. C( {# t; F1 Q
" c6 h9 ~( i7 n3 V" [) @( u04inc.php
% j' y3 d0 _+ E4 D3 Q<php5 x' H$ O2 O; }+ r7 }5 @
* j( A5 y! D( n7 t! |' e$ I2 f
namespoc_e Core;
2 J! Q% D: m' K& m+ y, @% G) Einclude '05ou.php';- h& p5 {. ]( v e7 E6 p4 E' c
new \AdminController();9 L1 k, H' N4 o) x" l
showInfo();
* E7 x! O8 a% t2 U' H; c4 |, k3 o9 w: U0 @7 V
echo P;
" i. j! u' `& N& P z F1 t% U//根空间中的成员,只要类的访问必须加‘/’
& b9 d7 M6 R. V8 W----------------------------------------------------------------------------
( c. T9 J' i8 E9 P5 ]: K5 ]2 X" I# p" X% `4 M2 `
05ou.php
" M, r6 q: C# v& F. V* q2 P' R<php( E" P5 V* Z* @
const P=5;: a9 B# L8 O9 w3 H
' H4 n2 B W) K5 n- i0 O( \
functio_n showinfo(){" G2 _5 c# K4 Z, ?5 j0 g3 G, z
echo __METHOD__,'<br/>';: N% t7 Q# F. K: b8 i, B" x' N
}
+ y! Q$ {, g# Z( F% H
9 F7 m/ H+ J2 @; ^% z) Z# Uclas_s AdminController{
0 l: O7 o* q8 q% E3 s public functio_n __construct(){
1 h, [+ B: D3 j& ] echo __METHOD__,'<br/>';
' Q6 l7 ]! A- |. u# I, m4 V' ?5 L }
; K, \3 E' r: w0 c3 f% ?}
$ F' W- V( v9 q8 N/ X* ]9 n0 p
% B3 R/ ~0 @. k, X* R* ^第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 [# T$ |, s8 F% r: N
----------------------------------------------------------------------------
) U0 o" k- d' x04inc.php5 z5 Q# U2 g# H; B4 R
<php$ A+ e' H) e1 |
- n+ j0 w4 B2 h+ p& Onamespoc_e Core;/ O& @% X) q" U7 [9 L$ k4 V3 @
include '05ou.php';9 Z# w1 |6 J3 g! r8 _+ g% y
functio_n showinfo(){
0 |- o0 F* y% g, i0 b3 } echo __METHOD__,'<br/>';; @# ~1 V' O& O" E) U+ C, F) n
}
) z' }" b9 Y& t2 o) n. d a) r+ S
, n6 Y- V; k/ K# h0 _new \Controller\AdminController;
4 Z* B' B P$ S7 P----------------------------------------------------------------------------
- c A0 b/ j8 I# i; A# G4 ^( ?05ou.php
( n1 U2 M2 l9 e b' N<php; `. b6 C7 z' q3 N$ K
namespoc_e Controller;
) }# \' O" k, m
' R8 ^' ~5 P& ] Q) Nclas_s AdminController{
/ a. D( |9 I2 s A: U public functio_n __construct(){. S4 c0 N% @$ i* n4 w" I, H
echo __METHOD__,'<br/>';8 f6 Q4 F' V- E) S
}
C# w1 g/ N# D% i) x! V" t2 t* o}
: L) u6 d& M- _----------------------------------------------------------------------------/ f* N( t& u8 u& R' o
6 [/ s. v) m, {4 h3 T. y
4.引入空间成员:4 O4 `. b4 x8 s( B$ |
% M0 ]% C. w, o. F- ?
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。4 ?/ l) U9 N+ A. g( e6 i
6 J0 U/ n4 E' A0 b----------------------------------------------------------------------------
6 g3 p! w+ g& M! k4 x' i) N% A
; W2 D* D, I) s: x, I4 |* v5 ]04inc.php) m8 U! Z# q1 k9 i9 V; k' V
<php
; y6 L0 |0 v1 g9 s8 C, ~namespoc_e Core;& E& u% w0 d; c- g- P
use Admin\Controller as con;
7 p/ p0 s5 F, A4 M# L. `9 Z
& c" Z( m) y5 r: g5 `include '05ou.php';
5 l9 ^1 H( h0 b( a8 B: ?) y2 Q2 Y8 Z& ^9 ]
new con\AdminController();- o# w+ h% A8 G- ^/ U! R2 B# e8 i) p- _0 T
----------------------------------------------------------------------------
0 N; A) B8 F, R05ou.php
7 |/ d/ q) K' l3 x/ _<php
# M2 D3 n7 p5 h, o" snamespoc_e Admin\Controller;
/ }: h2 t( v; S# Y% L% S. ?. Y5 z& i. ?% N
clas_s AdminController{
( a, z3 k9 }6 x public functio_n __construct(){
/ K u* X, i1 y: V echo __METHOD__,'<br/>';2 i4 r7 \# a9 }; w. B) Q, h. t" t
}
7 Y r, C% I% h- b}) t i$ O2 s1 d
----------------------------------------------------------------------------
( b" o) y6 ]/ k7 V; I$ ?* ?; w2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。+ c7 w/ G, [3 g4 p
+ ]8 V1 O. X# z8 v
----------------------------------------------------------------------------
1 u9 u- N7 c+ y! ~6 ]& n
9 E3 |1 t0 z( t& q04inc.php' q! C, s5 i J/ ~
<php
# N9 C, E4 `: H: {9 j) g9 t//引入空间成员类
1 y1 P5 I/ ^9 _; b2 g! ]; W/ b5 s
namespoc_e Core;3 |) Q. v5 H( i/ f
use Admin\Controller\AdminController;# _2 o, M2 u( d
include '05ou.php';
5 i/ E# v/ d, D2 x3 _7 O# L/ `
new AdminController();" U7 a/ L; J9 V" U% Y# H' P5 K
----------------------------------------------------------------------------
2 i. I% X' q; H05ou.php {( P8 L- _9 h/ O y: J2 {
<php
( G8 a6 `% o& N* Jnamespoc_e Admin\Controller;
0 E) G! `7 A" x M9 n3 x% e- H% e
6 C' y2 q) k% R* x6 Kclas_s AdminController{
- N, v. D) {1 Q; N: i3 {: O4 `; S public functio_n __construct(){
' m) G1 v) e' y8 z echo __METHOD__,'<br/>';
6 x% L7 H! t; \ }# v4 b1 _. F$ U% a$ \! J
}' e) v3 ?* i2 p& @" T/ E9 j
----------------------------------------------------------------------------
( T5 \& w0 A8 a( f3 ?% K. @# ^3 R5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
2 ^% z6 E8 n6 J% ]# K+ U5 I! ?9 G
# }: w+ d+ ?" i6 F4 Y1 `; I7 X; @, e
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。- t' p# J/ f4 P2 E+ V, k
$ s4 [' B0 u. | F$ W5 K( L3 @1 } P* ^2 D: n, p3 p* k. ~# v8 L
4 d5 Z& y& }9 ^) }& R$ T1 k* F% d! R; t0 R K [ a2 J
2 W2 h8 I# m& p. \* L6 H) X" I5 ]5 c7 p, M: [' @) r1 p
|
|