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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17183|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
0 @. C% T; n7 K: ^% z1 F1 _
" H: ?+ i. {. Q- @5 h* E在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:/ Y) P+ E, x3 k6 L! S
; v' n& E% j6 _  m9 t
. x0 T7 f% n6 N

9 v4 I) ~6 O1 M- E) _" T5 O# I0 w我们来详细的讲解一下PHP中的命名空间:5 N5 y( N% Z8 `
$ K+ x) W& k9 A3 E7 K5 S& w
语法:namespac_e 空间名\空间名;
" I9 y' \0 ^, d
2 i$ J  d2 B2 T* i说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:5 I( @+ h) `/ p8 g% j: _/ J
2 G  I, a, u- E. d9 G) `
----------------------------------------------------------------------------
: F/ \! I9 q! I4 z) r! v
7 y8 n* T+ G- L$ d: m" g* Z<php' d5 w- Z/ P1 S+ T# E( |
/ E2 a# i/ \) x3 b8 o3 r, R. [9 n
namespoc_e AA;
% M. p" c8 |8 W' J" yfunctio_n showInfo(){5 q& B1 x  e7 \+ Z1 N. ?
    echo __METHOD__,'<br/>';
  B) W5 `  [/ t/ U; M8 M}$ z! w  G( I, a8 J; o! X3 q( J
showinfo();
) N6 K4 t/ v' L$ R" |( f# y6 _8 }' B- d  z
namespoc_e AA\BB;# _+ `, ?3 O' F; S1 w, A

: U9 Z$ c1 K8 qfunctio_n showInfo(){3 m' Z) T8 H, t2 B+ F( E8 ]5 p0 k7 S4 l0 [
    echo __METHOD__,'<br/>';& `/ {" \: C3 p! w, S
}
* m& s9 f3 n3 Q$ G/ {) V% i- A//showInfo();# L7 ?0 y- l- O  D
----------------------------------------------------------------------------
9 C" N: Y! @( n' y: j9 E2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)0 x0 u! }) ~: O7 Y% Y

1 j' K" @) ]% Y# }) @; n* K6 m8 T3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。" Z0 t) F5 q% F

) H0 Q  N' n/ }6 G% L+ L----------------------------------------------------------------------------8 o9 X1 N7 |5 y. q
7 o, C4 u$ I, I6 _
<php$ }: Y8 B4 J6 i9 o* y
namespoc_e AA\BB;1 e2 I% R0 f/ ]& K6 s
functio_n showInfo(){8 T# p) Q$ ?% E, n3 @
    echo __METHOD__,'<br/>';
1 I/ U1 g! S: Q3 T0 w$ @0 A}& v% |" H, C& W6 C& T
namespoc_e CC;
: x1 ?- {. z' D# q/ F$ Xfunctio_n showInfo(){
- ]$ X. k8 O/ K2 f# i    echo __METHOD__,'<br/>';* h' d8 i4 e& X: C* @3 J
}
5 P2 k. Q! D6 V- ~# C3 c$ [namespoc_e AA;
1 r3 s0 l+ E" }; zfunctio_n showInfo(){
& L7 c& E, D2 Z5 p/ X" B9 D    echo __METHOD__,'<br/>';" r& V  Y' V5 l6 }. l
}
3 i  Q; `3 `4 K//非限定访问:用于访问当前空间中的成员
$ M$ V- y9 _5 k" K" fshowInfo();' r  V* |% U2 j
//限定访问:只能访问当前所在的空间的子空间中的成员
$ M$ Q+ \7 ]% b# p, x2 E) s: ]BB\showInfo();
) L$ s2 A# g+ o: u' l//完全限定:可以访问其它所有的空间的成员
6 P- \5 |& C, @* k& `\CC\showInfo();: \% p9 Y1 v8 Q, N, P' g+ @5 x
↑根空间标识符& Q0 x1 K6 j% K. ~! O
----------------------------------------------------------------------------5 v+ d$ g4 d4 ?0 K0 s) P
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:- \" E% b2 k# l( U* w

7 |3 Z0 F$ D$ h% M当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ X0 g! u/ G* p0 l# i
; r  a6 o( q' @8 W! W0 f8 }. x
代码示例如下:
3 }; h% T4 l% r) P* H( P/ }' D6 M* d5 t9 V
----------------------------------------------------------------------------4 x# [% C" {& X0 a) I4 z3 I' r

+ p. G6 W% L8 Y+ y* t7 ^& V4 Y
' O+ B$ g$ g7 q( B5 j' U$ X6 o04inc.php5 L* c( i8 g, j1 P8 j
<php/ f9 K9 p. y( [/ x  T. i, d% f
2 M/ k6 s) S8 ^9 Z. W  _8 U
namespoc_e Core;6 ?8 T+ C5 m; B9 d6 f# C; J8 ~
include '05ou.php';
) {2 c! \/ [' P8 S- {new \AdminController();. j8 f# |/ i5 A; e
showInfo();4 ?2 {- I, ^& t

; s3 s# e& o$ I. b: J0 jecho P;
) ^' w. H) R* V: _//根空间中的成员,只要类的访问必须加‘/’+ I+ {, Z9 H" p# z' l4 k$ Q
----------------------------------------------------------------------------
$ S( @1 c& X" E4 b* Z) A
6 a: P$ Z# D0 f9 q9 `3 }2 i05ou.php% q+ B) \; r& i8 d; c; u% U
<php  `7 A6 t" A3 Y; Y) w+ o; G; C8 h
const P=5;
+ g: J  a& |! ?( e
; |4 Y" v5 ^3 Kfunctio_n showinfo(){4 T7 o9 w- A& H. M$ d- \
    echo __METHOD__,'<br/>';
3 u" A3 \$ L- U, u}
: S* b# j+ D! @
- B; F. _! Q, y. Eclas_s AdminController{
; |5 u# g2 \8 [1 @2 k% `! R    public functio_n __construct(){
: N: T/ f$ \6 C4 t        echo __METHOD__,'<br/>';% c1 {4 m& j+ b+ D- M! c
    }$ {$ y4 O3 O* p8 o( K& I2 A
}
$ V: n3 c1 U6 `# S
& u) m$ s9 G& ?; n, _第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
- r' ]4 A( E/ B1 g+ F# b! H& G----------------------------------------------------------------------------
9 S; h+ S; B& z5 z) L04inc.php- A  J6 w* |1 a& |* e  U# b7 I
<php
5 U! k6 d1 a3 x: ^
% k, j! W) ]. onamespoc_e Core;* I: |. H4 e# l( J# \
include '05ou.php';
  F( a# v; B0 y# }5 g  o3 Y9 vfunctio_n showinfo(){+ `; f  B. j" Z/ S$ k
    echo __METHOD__,'<br/>';+ \) h9 L8 |$ h- ^7 s
}/ A3 Z$ K! w( l$ f9 R

( t. R- g" U5 p' y. [new \Controller\AdminController;! t/ q0 `$ M: A; `
----------------------------------------------------------------------------
% ^! p+ g! X- w1 L1 h0 ?2 |05ou.php
2 T& j( |1 e2 E* h- _<php
3 K' ?) `6 @, V' H0 @3 Anamespoc_e Controller;6 @" ~* d, j% X

( \+ k; ]; ~% `, X- j5 C! w4 {clas_s AdminController{0 r6 e* g1 S4 n
        public functio_n __construct(){; l; R9 w/ F0 z- Y& Z5 M
                echo __METHOD__,'<br/>';, }8 V/ l7 N. V# {
    }
9 F5 O+ g1 s- d3 q+ k; v}1 Z  e4 Z" w! T: _1 a' b- W1 |( J
----------------------------------------------------------------------------
8 _# e4 Y$ c- K
, d! g  f9 e* ]: b: s5 z) `' N, }4.引入空间成员:* y! r; i$ V" s3 S! _2 `; V" c

! ?  Y4 N/ O  |6 _$ @1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。* f7 h4 p0 T% E  b  q
& \, \! w- z: i: m7 \
----------------------------------------------------------------------------$ |$ [. z0 d0 `8 T0 e% h

5 l6 Y- B- s' m/ ^* j04inc.php
/ _0 F3 T3 f; u<php
$ l0 B1 `+ ~1 Z, F+ z' Qnamespoc_e Core;% m' K% Z3 \4 O7 m, Y: g
use Admin\Controller as con;
1 D% u# z& l  y8 T; ?( T' _4 t8 S  G" J* p, H) g2 W4 J1 E
include '05ou.php';1 Z5 O; j7 b( Q, W% m

- t* ?1 _1 h9 I% Unew con\AdminController();
: y3 l6 ]) t5 A) I----------------------------------------------------------------------------
2 j/ w, b) g8 A; |4 z* E05ou.php
3 K2 X5 l" b) @' W9 m* ^<php& |3 E; ]9 Q% d0 c6 {
namespoc_e Admin\Controller;8 V% `( J" ?6 u& \1 ^5 m9 f# T

1 t; k) _8 ~0 J+ H+ B" T8 |% B1 Z) ^" Tclas_s AdminController{
1 l1 _3 f4 t6 y# S    public functio_n __construct(){
7 ~2 L; C( n5 [( K3 q5 g! J        echo __METHOD__,'<br/>';5 o% }. U% v: \% D. e2 ]
    }$ z- e8 T5 B4 ?1 C
}$ K( y/ I$ R% }5 B8 ?" R
----------------------------------------------------------------------------0 I' Y' e1 m. j" O! E7 z/ G
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 H. e' x' R) m$ s) ^1 b

6 d8 w5 U; l2 l5 M----------------------------------------------------------------------------
% D: C, w: E$ R! N; I" \, p: [$ ~; o. ?& C
04inc.php* C% h/ P" I+ p* K" j
<php
1 k- r$ F* W; R( B9 B; H0 s//引入空间成员类
+ `' o9 C0 t, C" }- M  V" h4 h% }" r! b4 B+ m: d
namespoc_e Core;
- I( t) x: ~# v: Tuse Admin\Controller\AdminController;* j0 v4 z8 C2 F9 s  d$ {6 K7 i" r
include '05ou.php';* s" W# R, P6 x4 A. \
2 X/ {' Y" ^, c, [* t3 D: P% u
new AdminController();
8 K1 L# b1 ]# @9 _----------------------------------------------------------------------------
' G/ M  N$ u( i3 F6 S: ^2 W05ou.php  H8 a! R  W+ u' H% \+ K# h! S# c
<php
7 i0 U! _% A2 d2 b1 Cnamespoc_e Admin\Controller;
5 A' R- o+ z/ d3 S- \) i
- z( ~3 |& P! t, T- ^) \clas_s AdminController{
  j+ D9 o: ~! y# N: I    public functio_n __construct(){* M7 U& @8 q0 P
        echo __METHOD__,'<br/>';3 t8 U- `) j' P& W1 ^4 o/ [
    }; x1 O4 |& N- H4 f2 `
}2 S+ u' G; r6 i8 u' e
----------------------------------------------------------------------------
/ _: Q: K# K9 Y! p) \0 ~, X5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。. y, [, m" t6 R+ W4 z+ l

- H7 r9 x- h9 m: Q% A4 d
) B4 I5 V, ~9 x& X* v4 \4 ?- \这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。1 g' K$ Q$ `3 m- P: z( Z. p
/ @0 K: G& n6 }7 U9 e
- Z% v, a+ ^# ~. o8 c

7 W8 [! [7 A8 e+ g
/ Z1 K, ~! x$ T" A+ H5 k
. X3 z8 V" ^  }+ O* m' {0 p# _$ M
2 u1 X) \+ r0 y0 E: W- @9 {9 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 21:11 , Processed in 0.055933 second(s), 23 queries .

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