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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:
( s7 H5 L( r: b; t: q  A: N) D+ F  M* T* m, n* y$ P
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
/ e8 }6 T$ a$ l: T9 N: F4 x
, k+ W1 @; V: j0 z1 m5 g
& x4 ^& b1 f0 i$ ?6 u- s5 I- \1 N+ D+ A* W# C0 o
我们来详细的讲解一下PHP中的命名空间:
4 ?3 G9 n/ g4 Q0 {
6 O/ T5 T- ^8 \3 L, q语法:namespac_e 空间名\空间名;
6 w- k4 V: ]( Q. u9 ]" o% V: T* [" J  ?  C2 B2 v6 o& A7 `
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:0 Y5 g5 {1 _, w) \' [! R
; B0 c; y# k6 z5 X9 q+ }
----------------------------------------------------------------------------
# A& T* t7 A7 ~' C+ h: i2 P. C, r) ~4 S& g9 |6 X1 F
<php4 n5 r3 Z* O; b$ f

: l7 f/ [9 d4 h  T, A; ~namespoc_e AA;
+ @* `# d7 F5 e) K3 f/ Gfunctio_n showInfo(){% ~8 O( {$ k% H  _; E% `
    echo __METHOD__,'<br/>';
  f5 T  ?' _, E8 I}
0 |" Q8 W6 A9 k7 j* f4 ?/ vshowinfo();
; a( n' V$ }/ N" ]4 \6 K7 `
3 T6 O4 I5 y8 z9 Jnamespoc_e AA\BB;
. A) |$ x4 H5 Q, H9 i! Q9 h. b" z: Z) }! ~) z
functio_n showInfo(){
6 X7 _2 M) e- y  }7 i6 }    echo __METHOD__,'<br/>';1 R6 [5 A: T* i- y) K' H6 Q4 D
}+ X$ {( k3 j0 X( y
//showInfo();
" {, O0 t: f" |% q----------------------------------------------------------------------------* M6 e" D; L! ]8 F% j
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
. P' R2 u( E& B" m% r
( W/ A/ M0 t2 W/ X3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
+ u. U- R6 S; X8 Q7 e- }
) `; L: |$ D) a+ J----------------------------------------------------------------------------) i4 B$ m, F4 y! @) @

" s7 ^5 ]- J: [- n<php! T0 t: x" a8 _& h
namespoc_e AA\BB;0 t- u* |  b% N* ^$ {9 N
functio_n showInfo(){# V& D! h: K4 Z  C8 G
    echo __METHOD__,'<br/>';
/ O2 w/ F) K4 V8 R}' H0 }! B6 t5 ~2 T( K
namespoc_e CC;6 H! z+ c7 a& z7 l. _
functio_n showInfo(){( Z, E. z% `% @# ~9 A6 ^
    echo __METHOD__,'<br/>';1 c- O; A4 V. \' A
}
  s/ ~0 m+ S9 d& onamespoc_e AA;  D2 ]& h. N' U+ _) @" w7 y
functio_n showInfo(){' s) z) |5 v" u- |. K
    echo __METHOD__,'<br/>';
' E; r/ I. d3 y2 ~}
' k" c; c0 i- r! o# [//非限定访问:用于访问当前空间中的成员
1 d: w0 f# K3 F5 Y# n" ishowInfo();
" \) {6 r, q/ i. A# I2 _//限定访问:只能访问当前所在的空间的子空间中的成员6 K4 y: x* }/ C3 Z) g" o
BB\showInfo();
7 r- T% ~7 a, r; s. S//完全限定:可以访问其它所有的空间的成员
- L4 U) {9 ]0 n; Q8 n! _( p0 r\CC\showInfo();% K+ y/ N- Q- v1 D, D* \
↑根空间标识符0 z6 j& a4 A" o, z4 n
----------------------------------------------------------------------------
  H" w! i# m- X# h3 B. Z但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
2 ^1 }  w( O+ j) b  c( r% L, f( B5 T# T1 ~' b2 K# y
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
" n5 F' O6 k% K; x) K( Z" O8 o
' E3 z% k1 ~% X7 g% s' z代码示例如下:9 I7 _+ ^: S9 T3 k9 t, |% I1 Q

3 Z5 b" C( g! b( a7 i+ h----------------------------------------------------------------------------
. z( I( B# E: v9 u4 v: T
0 Q. E9 q* E; e/ Y# r& q4 i
% P& Q3 `- W3 t) q1 E04inc.php
' }+ u" C  T2 P0 F9 @  u- N<php
" e1 T, p, S6 U9 x- o0 |& X
( G  y; o3 b! gnamespoc_e Core;+ G) p9 V: r% C) m) P
include '05ou.php';
1 N: M- f2 B* K9 J0 h" qnew \AdminController();
' W* e/ l# M& d$ c9 sshowInfo();: w! V; |- F: W+ y; `9 X
5 h) }0 V8 G' B0 V9 e. ~9 n
echo P;; `) @- T4 U$ ~) F  b0 |/ D0 P
//根空间中的成员,只要类的访问必须加‘/’$ O* {# ?3 s  |
----------------------------------------------------------------------------' g, a. ]. l/ n/ O2 q; {( ]
  a/ Q% e, L: U% K& V, k" O
05ou.php' ^* o; M- u3 O/ n, I
<php/ s6 g( ^$ h& l$ N9 g9 N
const P=5;
0 L8 K. Q2 v* S1 r
2 P: v% V9 W4 \4 W) a( wfunctio_n showinfo(){
$ `- ?, q( R- m2 X4 ]% R    echo __METHOD__,'<br/>';( @; b: Z; E& s  K
}' o- ]$ e8 b" ^" v$ P

1 c3 L7 O/ b& q/ b. a" v' ?clas_s AdminController{/ S2 \% t2 I  q& C$ \
    public functio_n __construct(){( G1 T1 z1 A. {
        echo __METHOD__,'<br/>';
2 o* d  s; Z2 A5 t, V! `    }
+ \+ W  ?. |: v" s6 A}
2 `' P0 k" T  V; m0 a. f+ p6 \/ S1 ~. E0 M) k
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ |1 P$ k' j& {9 i  ]& `& i3 g# s
----------------------------------------------------------------------------1 a. f) Q, U- o% M" E
04inc.php
0 r  D$ @) l6 }8 y2 F  J# v<php) k9 P4 b, w; o  Y+ A4 P4 o& f

7 T# K# y$ s; _* j2 mnamespoc_e Core;
( d3 v( x8 T2 Z" f0 uinclude '05ou.php';% N% \* a' v. k5 @0 m& d  K" X
functio_n showinfo(){
- j% f- v9 V8 a5 l- w    echo __METHOD__,'<br/>';7 O) Q3 x" u2 d2 B% e
}
2 {! L3 x8 |1 J* e0 c! c' l0 V, {7 \9 S9 x7 M
new \Controller\AdminController;
, k3 L% F* s% F----------------------------------------------------------------------------* |+ N6 M8 w- ~9 G) `- w
05ou.php5 D" L! i* r( H& W, u
<php- I! P+ X/ B$ J# ]4 p% v( r
namespoc_e Controller;7 F  p% p  H+ {. P7 c

5 H8 u+ E5 b6 l5 W% g$ B$ @% w0 zclas_s AdminController{
$ H- \# @; ^, d4 y        public functio_n __construct(){9 x, {/ q% U( X
                echo __METHOD__,'<br/>';" ?$ n; V! `9 a1 F5 V; v+ a
    }6 X; h, J$ d$ \2 ]  L& E
}
+ f: X" N1 n2 a; A# B, ^----------------------------------------------------------------------------
( V* o, k* a: K; \; f# \- C5 M  X4 {9 f2 b! t0 Y
4.引入空间成员:" G8 T/ n3 v8 g0 R& P

# g* X' W, C, w% R# E) {1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。& G7 C/ O, }, j
1 d' j# u- [% o1 I& j
----------------------------------------------------------------------------  U2 W5 p7 m# b9 o; Z( R
0 s, _2 a# e4 ^% M7 d. Y4 d% {1 e' g
04inc.php1 X& V9 o8 s1 A
<php
9 T' u; C! u+ C: K; B6 {: Pnamespoc_e Core;; }) I7 Z( i+ p: E" T& g
use Admin\Controller as con;) Z( }& B0 L4 _

% C4 m! X! P3 {. f/ C/ m! l! q* B6 P+ [include '05ou.php';
! s9 u. y; Z, X
# A6 h! `, a) A9 B5 i" z2 Gnew con\AdminController();6 O4 ~- `/ L# _+ j& ?! J# H2 [
----------------------------------------------------------------------------
$ T9 w% V$ x( ]+ f5 y0 h05ou.php- H/ P; f0 m5 E: Q2 k
<php
& |2 ?& _9 H, c4 Knamespoc_e Admin\Controller;
4 F  b' {* Z, a
7 ]- \0 ]$ N  w* u* uclas_s AdminController{
7 o/ Q% @, T  I    public functio_n __construct(){
( U2 o# t! H( Y( I2 f        echo __METHOD__,'<br/>';; U& Q8 r$ F/ N7 |. E1 U  X
    }9 n" J# |. {* q# c- z: D7 |. d
}
  X. W- j. }' ?% v9 C' L1 i----------------------------------------------------------------------------
0 e- E/ w9 ?. z: C" [2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
. U( r6 C3 _& M9 E4 l+ N
; r) m# [8 H: x  E/ M- x2 ?% S3 s----------------------------------------------------------------------------7 ]/ N0 G) {- w5 v: W! M% i
7 s# J+ U. ^; x! r+ W
04inc.php9 W3 K, F; ]; H* n5 q! {
<php: s9 [3 e* A% M$ @+ _9 |
//引入空间成员类' s8 P' R, d6 w, F! B
0 R# _9 _. m0 ]7 n
namespoc_e Core;1 |; S2 D+ T7 m0 t. q7 s
use Admin\Controller\AdminController;2 r' W( e: X. z
include '05ou.php';5 m" \8 M/ {( j0 }6 t

: @; n/ I/ w9 d! I0 rnew AdminController();
/ C; ]2 f5 O1 c6 ~% Y4 w----------------------------------------------------------------------------
' B' w; l5 m( c" \) q5 r05ou.php! v8 F; h3 |0 G/ J* R! n' |
<php
7 a- x: V/ n( _; p  R9 T/ `  Tnamespoc_e Admin\Controller;
$ J' j$ q+ W6 y% b, ?9 H0 H- q" S. f
clas_s AdminController{8 |; W: R  g. }3 ^2 y8 L6 S+ q
    public functio_n __construct(){' n: Q: R; e+ @
        echo __METHOD__,'<br/>';
( c6 b) W9 @- k9 X    }
8 ~6 Q3 o* x( b  k}
5 e  ]0 R8 p( T6 m6 e8 ?; i----------------------------------------------------------------------------
, H9 P+ @4 t2 X1 C5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。6 w; U3 J, t7 I  c; A% a
( w9 G9 I+ k( l
8 [8 W- v9 \( A
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% [) L9 V# u+ g3 n: V) ?5 q/ \9 t+ B, M% l  |# u' _
+ W. D* r7 J4 b) f+ S/ G: H
* r# V; U! {6 I! {, S

' F8 K0 N2 [8 |/ K- l
$ b0 L- W3 Y# M2 ~; a2 O' e% K# a7 a' @" m/ _; d; I' i% b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 15:00 , Processed in 0.082894 second(s), 23 queries .

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