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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17738|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:6 x; C% D8 U& C+ e( `
- `  e2 [3 N$ @5 h: j. b
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ H) `! v$ L, B& f' j

$ m# q5 ]' Y* D5 t# t+ F* L 20181201105307520[3].png
' c8 x1 Z- |- ?$ r/ G! V8 j+ O) k8 Y0 |% |( s
我们来详细的讲解一下PHP中的命名空间:* l% n! `9 K( O, [, x% v
2 |. _: X1 b6 U# I9 q2 u
语法:namespac_e 空间名\空间名;* ^9 T, G: l8 h3 W# q: g) u
9 W; e, @" _1 W
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:( {: x% h) q+ i2 q" R
; n( J0 P4 W5 `5 N' p4 j; i2 m
----------------------------------------------------------------------------
) b! T9 A& d9 d! k) s% w, L* S) j( \0 R
<php, R+ I2 _9 M/ o  q
  A" p3 w9 k7 E! I$ S  \! M7 p
namespoc_e AA;
) g( A( P! ^& e3 t  Bfunctio_n showInfo(){
; J- P; b' Z9 F, A' F/ [    echo __METHOD__,'<br/>';
4 {+ D* w) r" I2 m+ W( ]}6 v4 _+ W5 b$ X$ {5 S
showinfo();8 A+ B" \- f* ?1 V) ^

% W! [( A, D- X& f  t6 ?namespoc_e AA\BB;
  W% D% H# n" \
! w0 H9 [& W  }! I9 o1 ]1 ]' a! j; ~functio_n showInfo(){
4 x' J  [( F2 k! {. }1 l    echo __METHOD__,'<br/>';
: K# Z# q' e0 U9 n  n; T}
4 s( P: Q% h4 b' f6 h//showInfo();$ G/ H# s8 E2 N$ N- G
----------------------------------------------------------------------------
, T- C! [6 Q9 ~  E2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' R8 x( J4 H. E3 P% {& j

9 D5 ?( Z) |) y1 s; B4 i1 @3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
8 Z9 \, ~' L1 Z8 O3 M* E0 y% W1 F) m# b) s* z9 m  ^$ @
----------------------------------------------------------------------------
: G; c. z2 x. a% |1 O8 M+ e( ^: R7 Q) N% U
<php
4 v; N+ V! r  J) O8 W$ p0 W, inamespoc_e AA\BB;5 `% T' l; s' B$ w9 |
functio_n showInfo(){5 M( Q0 V$ P1 L+ ^2 d
    echo __METHOD__,'<br/>';
& ~1 s. n/ I3 B% d3 F6 ~0 X/ N}! k6 Z1 _7 G/ R. s$ e
namespoc_e CC;
: @/ @+ }* ^0 E; C- D% P& M) nfunctio_n showInfo(){- i/ {& A: T0 I* T- d6 M
    echo __METHOD__,'<br/>';. }' D5 ^5 X3 b- r7 z" a  T4 U
}
0 r6 ?$ n! [) W  {# K% wnamespoc_e AA;
+ T7 y2 }# C# h, ~5 l+ yfunctio_n showInfo(){
& M6 r+ v- W6 g  M# W8 ^    echo __METHOD__,'<br/>';
+ x! I( g2 Q& [0 }- s/ [}
) j/ {% ^- Q1 E' A5 Y8 E//非限定访问:用于访问当前空间中的成员6 y- |% h4 }5 b3 @
showInfo();+ l. a& F- |! A  B% G! k3 ]5 l
//限定访问:只能访问当前所在的空间的子空间中的成员
/ D* C3 L1 m7 x$ y* r- ~4 w6 JBB\showInfo();
3 S! o( t  Q9 H, v//完全限定:可以访问其它所有的空间的成员" x$ a; I" Q, B0 Y* J7 c$ G# O
\CC\showInfo();1 y3 L9 W" o1 Q* \' K2 [7 y, U  p
↑根空间标识符
7 n' ~/ @0 w* `) D----------------------------------------------------------------------------, Y* Q2 K) P1 y
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
( A; N9 W2 X8 x7 F# U) ?& f2 m# C& i" l7 e/ T' f. E
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
5 Y8 ]- \# e3 Z" Z0 f. K5 @5 U" n; ]  q
代码示例如下:  F* `5 ^8 T: _

# j6 L2 N. p" A7 Z* n8 F' ^----------------------------------------------------------------------------
2 I4 P% K7 M9 A
8 V# n: r* `$ a
6 w) A2 _' X( c- Z- c; P04inc.php
/ A- z& d! ]4 V% D<php
4 b. X! o4 K9 ]7 @6 E4 n% ^
0 A, I5 i7 s0 e& pnamespoc_e Core;: W- ?  |$ q9 A- \0 {/ G7 z
include '05ou.php';) u2 u& S$ K. k3 a  r& H
new \AdminController();
/ \' _; r3 ~2 |- I0 Z# o( B& rshowInfo();
' ?. r$ Y: O& @. S
4 v7 E; i( C: i' |echo P;
1 Q/ f! K# o, ~7 e: v//根空间中的成员,只要类的访问必须加‘/’/ m6 J1 @0 N6 L5 [' c
----------------------------------------------------------------------------7 A5 J. ]- l0 B( Q3 y

# V/ M" E$ P9 N3 l+ a8 F. S: T05ou.php
$ f5 o$ G# ?9 F& o+ ~) Y: D<php, C& X& o! K# c+ D7 ~/ J0 Y
const P=5;
3 H8 x% R& V% k6 j$ H5 c
' E' \! k* W" Z. {" L$ Efunctio_n showinfo(){
6 S" Y9 f5 T) G( F. M. O    echo __METHOD__,'<br/>';
( _' R; x6 Z5 x' s6 z}
4 R' s' n$ w% T) y9 V
- H; Y( {) T4 Bclas_s AdminController{
2 M: @4 U6 |& U! E9 v% q    public functio_n __construct(){
/ R- ~! z, ~, H+ y0 g6 n4 r        echo __METHOD__,'<br/>';
- y; a# h, i; `- b: C( f9 A1 O    }7 i9 d1 V1 Y4 V7 _: e
}
7 ]  Y+ ?9 |) a4 F( F: h( b0 u8 F% s. ~# h8 x
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。$ E- n  U8 H" I* u- T8 ?+ d
----------------------------------------------------------------------------+ S; c, x# W6 a/ P) Q1 @
04inc.php( _) \2 n7 C. ~$ f
<php# B1 o& Z" L! b, j$ _/ T
# b0 A2 ~% p( {$ A
namespoc_e Core;/ |4 }1 d3 N  E
include '05ou.php';
  L+ E' B* K# Sfunctio_n showinfo(){
3 w5 ?6 v% X3 z( c7 }    echo __METHOD__,'<br/>';/ V2 F7 m" O3 H3 y) ?
}
" D8 z! ]6 F  Z/ m" }2 L7 a# g. [8 x+ V5 |8 @: x
new \Controller\AdminController;8 Z7 G, K' F: @% j! n) @- w$ {
----------------------------------------------------------------------------$ k* p0 w) F0 O2 K, W; O+ @1 R* s
05ou.php
0 ]+ R+ W. S* Z<php+ {& a" r6 H5 s* H
namespoc_e Controller;
+ V9 c' q% g5 C/ J4 n5 `  O/ m( y; T5 y. B" X1 Q
clas_s AdminController{+ G% ~& e3 G. j- Q% @
        public functio_n __construct(){4 v1 H/ l' \  [  ~' V! F- u
                echo __METHOD__,'<br/>';& _; B7 N0 o0 m( N4 l- o% b; ~+ \
    }
* M& g$ h. v: k* `/ x}
' i* M6 d3 ?# F' [6 F----------------------------------------------------------------------------
, p3 \- W+ c. Q7 v4 R9 B2 L# [0 p" p* I; o
4.引入空间成员:, Y6 _$ K5 q; G) Z# F( w

0 r: Z, ^# m* X6 e1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
$ c) F1 O' d; k% v& m/ o; Y
. }& v  l$ _( R3 o----------------------------------------------------------------------------$ F* k& V/ R5 X- B

  f  p* A0 X/ O2 s" {. T5 H  i04inc.php
% f9 i8 i3 {% Y& {# m<php
7 X- {/ k& }5 q) [9 hnamespoc_e Core;4 f/ G1 o7 ^: [2 w
use Admin\Controller as con;
2 n# m: P% U* V' g+ Q5 C1 J
, W" A1 O7 x% u, D' C; Q; Dinclude '05ou.php';
5 F7 X6 ~* {1 W1 A
+ l- U0 D- I2 D0 @  U7 Znew con\AdminController();
& V' a( O# s0 ]: @" v% w/ J----------------------------------------------------------------------------% I9 q3 M7 X3 @, k$ c
05ou.php2 W# G; P/ o5 r, m- V, w5 S# e: @
<php0 Q8 k* N4 D5 T# o
namespoc_e Admin\Controller;
! w! ^! N) r1 y5 ~% S& ?" F5 d/ l$ n% p. X2 ^7 V  T
clas_s AdminController{- }; o! ~+ f- M3 _
    public functio_n __construct(){
* P& r* i0 |  g/ A        echo __METHOD__,'<br/>';5 W) Z! _5 J% _& Q; d
    }
7 O% g& ~8 f- c' a" @$ b, E}
7 n5 F3 [5 L# d  w2 j2 L4 q: g2 P----------------------------------------------------------------------------: a$ e  a0 k# E
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。; ^  Z' _9 X# w; }- d
9 E2 T- K1 Y+ P, l5 {
----------------------------------------------------------------------------6 @" g( ]. l& L( \) J1 j

+ B) O; b5 M" n. l04inc.php
$ j6 s& F/ y. J7 @0 {<php% a, P( J& U1 d8 s
//引入空间成员类
- m# D5 K0 U! a+ j; `6 a* t8 U; `" _7 Q
namespoc_e Core;
' `( o0 ^8 u( M3 ruse Admin\Controller\AdminController;
  a2 H% @) ]+ P0 [) H/ Q6 i$ s6 J% Rinclude '05ou.php';, ^$ \$ M. @# `6 \& m; u
& F+ v# o+ _2 [, {! p
new AdminController();% |7 e  b2 l) x
----------------------------------------------------------------------------6 b3 J0 ~  Z- r" k, Q# h. ^
05ou.php, O3 F) I  D  C; f" o! x( N5 m
<php  I, D( E& S- |5 F8 C& X
namespoc_e Admin\Controller;
& n" H1 K; M. f7 v% }3 v1 y3 ?! W$ t/ D" H1 Y7 d, X; D
clas_s AdminController{
) [+ M3 j$ C+ c! m. |1 Z    public functio_n __construct(){
+ K! X, g* x" X' |  n# n        echo __METHOD__,'<br/>';! A$ u$ J; _; u& E. Z% X+ H
    }
% q; A! u# P7 x}6 v7 L: c" M+ v$ F2 X7 v% e
----------------------------------------------------------------------------
7 ?/ X2 e6 f. Q5 o' \, Z5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。( E' f) \% ]$ m  Q

9 ~- a* p# P0 \- p( ~- r: }
, S% Z( g; o- D. n这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。- r, I: J9 F( Q  v+ X- d
; o  ^7 K6 T0 B3 O

5 `6 q2 {+ M) [$ S0 k0 G
& I" @2 K7 e* @) @, _' W" h
( Z8 g  Z/ C1 y
( D7 N8 j& D; O4 ]7 E' |- p: k$ }& Z3 {: U$ |; G
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-19 16:44 , Processed in 0.068498 second(s), 25 queries .

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