您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9885|回复: 0

[php学习资料] php中命名空间(namespace)的作用和使用

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:% x+ o2 Z" Q  O  G) c

3 D  l7 e: n9 E( Q7 Z在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:7 ?3 v9 r. N6 @
1 d3 s' C2 Q# P* Y* k; ]% ~
20181201105307520[3].png 5 m. ^4 n; Z6 b- O, Z) N! V

' |1 n3 T( X: b+ [我们来详细的讲解一下PHP中的命名空间:
' w" Z6 \' e1 {( J) G% U$ I. `8 `: L3 X7 h0 i! W( g/ G$ J& p. O
语法:namespac_e 空间名\空间名;
, q9 U8 m- n1 m
+ J, ?8 B2 }* x说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- A& ?- j: o+ x! d% C0 Q' W- J- V7 {

6 Q: D7 D4 e! C4 r- Q$ X- y* e" W: U----------------------------------------------------------------------------. f2 R% f9 i7 |' S6 Y; n! J# G" {

5 H6 X! q% d: q) G+ y<php7 T2 a4 f0 S; J
+ ~* o" n0 H; s4 Z/ e6 K; j
namespoc_e AA;+ C5 S2 k% a& K; o& o
functio_n showInfo(){3 @/ w5 }, y5 y( |( Q5 Y
    echo __METHOD__,'<br/>';2 o6 B5 S# r/ _
}
$ R$ }$ ]$ Y* s; {7 \. nshowinfo();0 q1 r. u6 H8 `5 H6 ]* B

% N3 a. W9 _7 }" }, x! ]: z/ Znamespoc_e AA\BB;2 l' y; y4 ~9 P
5 k( z  l! Z% B. ?
functio_n showInfo(){
" P+ J' E# T: T! }    echo __METHOD__,'<br/>';9 W4 X, E! J# C6 p
}7 r# I% E# f5 p0 Y; t' V
//showInfo();% s1 ?' \# e4 J- N6 }( C
----------------------------------------------------------------------------
. @' J$ Y' N, i8 J1 t; A+ C: [" E2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
: h3 T7 l1 Q1 t! c& m7 i. q& Y  K  q* \( X0 e- ~( k* h% F4 X
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" A% f1 }0 Q4 Q) p
; h; W0 A/ f! V; G* `" K& M----------------------------------------------------------------------------
7 V- r$ R1 F3 N9 R4 u, b, X7 ~
: O: W: a3 {9 B6 i7 C. @; o* {' o<php
; m' K# C0 R) Enamespoc_e AA\BB;1 }/ y: D  e* s1 V# u  P
functio_n showInfo(){
/ X, g* z! {) G* H( a7 c8 A    echo __METHOD__,'<br/>';; t! f4 V" z7 R6 n) _9 w
}. q  g( A$ w& Y% R0 v4 ~# F0 c
namespoc_e CC;* v- |" L- `4 X+ j. R6 s( I; z
functio_n showInfo(){% g; ^- @8 a% ~4 `( D4 O
    echo __METHOD__,'<br/>';6 h: l6 ~4 N0 R
}
  p  E- L8 M6 ^namespoc_e AA;
% J! ~8 b& A5 G) H) M. D! O: ofunctio_n showInfo(){$ R, M6 ?: X. H7 {8 S
    echo __METHOD__,'<br/>';9 {) y7 Y8 I- I3 u& @. A
}2 h3 d2 w" M; O+ O. k
//非限定访问:用于访问当前空间中的成员
. _0 C/ r1 h( b" m' ishowInfo();
0 N& @* D7 a& b0 f//限定访问:只能访问当前所在的空间的子空间中的成员
$ K4 L" `* \6 Q* N3 G  t* LBB\showInfo();' K1 ^; E4 X3 J) R* Y6 H
//完全限定:可以访问其它所有的空间的成员
; ?8 ^9 D  s4 f' B8 ?# V4 j\CC\showInfo();
/ u! F- L" b( p↑根空间标识符
2 `9 ~+ j% E& G2 [----------------------------------------------------------------------------1 z% s8 a/ r6 e  c$ T
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:( Z1 ~+ h: x8 m6 A; p

' a! A6 q5 J% L0 B% k当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)- p% K- l) T1 S

1 [- o4 H# h: r6 H% F代码示例如下:' T0 Q$ P" J% e
7 F: ^: h, W! M  ]- E
----------------------------------------------------------------------------
' Q) @) Z3 J1 k# G8 Z% R" ~
3 A8 V: a# n! v5 f0 O3 ?7 l3 W* w- T7 ~( R
04inc.php! Z! R2 \- y. E  m& i
<php1 O  Y6 g! }& p

7 R5 g$ J1 A8 P/ e7 ?/ Y% r# C& y0 Dnamespoc_e Core;
+ P4 D4 C$ W0 P4 w! o1 ^include '05ou.php';
' L( V1 K. V/ a, ]5 ~0 knew \AdminController();
$ b7 s; ~1 a- l# X# x: d4 l( HshowInfo();* ^' P  K" @! L; c# [# v- W

' z5 r0 A/ E9 [" s: u- t+ e+ u$ ^" Vecho P;1 A$ A2 |5 }. j- x, G2 p
//根空间中的成员,只要类的访问必须加‘/’- T4 Z7 _. e: z5 k$ C7 J1 U
----------------------------------------------------------------------------
3 u2 }$ q# \! W/ E; g/ W, P7 s4 g3 I6 _7 L% k, y
05ou.php
2 g: Q3 j+ m+ }8 C, C$ A<php
: b3 q. E, h9 s' [( xconst P=5;, @# L& W9 }5 Z
7 p- s2 ?' t' U/ H4 X- V; r0 C
functio_n showinfo(){
' k. b/ q* e/ _- `0 q    echo __METHOD__,'<br/>';7 K4 e) K  w& l) N
}
9 A9 b6 f3 }8 Y4 T8 }+ Q# j' q4 N! `2 f  z
clas_s AdminController{
! y, P2 V0 N% n" z    public functio_n __construct(){' H' H- i3 H+ w0 H9 S) S: x
        echo __METHOD__,'<br/>';
- C' p7 P& D1 O; F7 W/ a: x# w    }
$ N& Z4 `! i, m. P* E}) N2 q) M6 d, A9 J, x' o! O  j/ i

- Y. w( z9 ]) V4 X& W* n第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 M' A4 b0 D3 {- [4 ]----------------------------------------------------------------------------
, \/ ~7 r6 B/ i; q  R8 C7 d3 k04inc.php* H  F; F+ t/ u+ U! ~5 E
<php* y# m& E2 D6 K# Y

; q2 Q3 L# J+ b- Dnamespoc_e Core;
7 D/ Z- P+ o+ P) Minclude '05ou.php';& x! v4 c: Y% _+ @1 Y. T
functio_n showinfo(){9 t4 h) m- t& ?  [6 p- ~* I
    echo __METHOD__,'<br/>';
) z4 E. P. c1 U}# @& ^, e* }) Y4 V6 N

! u3 c0 C: O* d3 z1 P4 Hnew \Controller\AdminController;' X5 Q5 w; \! P& W/ a( k
----------------------------------------------------------------------------
5 Q/ G; K* I) [8 m05ou.php
" z. k' n6 k+ q<php
. S  I  h3 c" K* d, ]. f/ W/ d0 F' ]namespoc_e Controller;
. ]5 L8 a, i& Y9 Z8 _. `0 Y" [' [# x& b
clas_s AdminController{
6 M# y# [7 ]: X  y' ]  v& Y        public functio_n __construct(){
  b, _1 [0 x! \7 ~" f                echo __METHOD__,'<br/>';
) n9 C1 [: F7 {+ b: T    }/ P# s; F  [' {9 b+ @/ f( f( w+ _; K
}( f9 I5 V! \) W+ W0 A( t+ X. s( P
----------------------------------------------------------------------------
4 m. y" ?9 R7 T9 _2 J+ z6 _
8 Y* G  c5 \7 S/ ^4.引入空间成员:' W! T3 K% z: q8 p. G) G
9 s# G8 Y7 z- k
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
$ @8 I% ?- m1 p, N: m
4 t6 S) C  m, o3 p" Y0 v----------------------------------------------------------------------------# Y% Z8 t  s, r$ d

3 _0 _, P7 g1 f- C04inc.php, K0 ^5 ?" K' D8 x. m# z: f4 v7 l
<php
4 R- m  D4 y, x7 j1 I: v" w. k8 xnamespoc_e Core;( w* i# ]$ L, s5 `# ~
use Admin\Controller as con;+ |" ~, E+ Q$ V( [, u# `

6 _1 g  ?* i/ Z# d6 ^3 k! qinclude '05ou.php';
& R/ a# ^- L5 h! U' ?
& p4 p* j* L7 [; `# }0 o& Knew con\AdminController();
0 Y* {' _6 d/ A  f& d! S----------------------------------------------------------------------------2 [3 P8 a: F& x1 X* o& y' l( H
05ou.php" C; g7 P9 a0 G3 ^7 u
<php: J7 G7 G5 I& ^6 ?4 c( E8 h4 u( s
namespoc_e Admin\Controller;
: U1 k! Y2 r& v; p/ k: M! a' N, `# S6 n
clas_s AdminController{
4 T7 p3 M9 ~; t6 `. o    public functio_n __construct(){2 W- c) k8 d! g0 `4 c/ C& W9 F
        echo __METHOD__,'<br/>';( S" X3 G: a5 j% s
    }
6 f8 t) c& B# y1 H% l  z8 m}
! V! g5 q7 T% d$ G4 c- i3 B----------------------------------------------------------------------------
; G$ a$ |  @: d/ |2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。/ `7 `- B, |) Q5 u/ {! w& d7 G
% i# ~" J$ B$ T! p% ]4 f
----------------------------------------------------------------------------' X& T) i) U( B  e

  ^4 C3 ~( g# f8 g3 A04inc.php
$ Y, k0 ]' o/ ?) R4 p3 M: p' u<php7 f* L6 R: t/ X+ u2 {
//引入空间成员类
3 M* Y! a. K; c; F) q6 a+ U$ Q* e& t3 @
namespoc_e Core;
8 N6 `# z) j& p  ?$ K& ouse Admin\Controller\AdminController;
  M2 L' Z2 N; x, b, Z1 J# Oinclude '05ou.php';: h4 R( [, M  p1 q) v

, v8 T5 x3 ]; Y1 Onew AdminController();( m6 T) J2 q( W2 G* g
----------------------------------------------------------------------------$ {; `$ t; K- P! k
05ou.php
4 w: {* z3 `4 W. Q+ ^<php+ T% m+ P  [! x# @: T4 c
namespoc_e Admin\Controller;
3 Y7 Q* @' o+ h, ~2 n& q4 K2 E. k! O
clas_s AdminController{
" o5 S$ n6 O+ w1 q6 `7 _    public functio_n __construct(){5 u' f$ R. ^  I9 z6 s6 b
        echo __METHOD__,'<br/>';
& p0 w9 y- z% G    }
: Z. d) O! l8 c1 U8 p/ Q}
3 z2 F0 A! X& R----------------------------------------------------------------------------: q9 J( p' i  [. `
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。7 M4 F4 S! b: k0 [
- j8 N1 k& R% g2 I5 g, R
) y, [4 W$ M5 ], W
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 a8 c0 [9 f: d3 E" a, g! |

% k4 E. r# b5 L3 U4 z4 Q6 `7 S" T4 \: O5 s

1 \8 {+ k5 u9 N$ C. ?! X. P. ~5 d3 J" ]  [- e8 g  S* Y/ X( k
+ q& w! w; @  A2 S
: b7 R4 R& Y" H; _! r
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-14 16:15 , Processed in 0.146759 second(s), 25 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!