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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:: T  \: y) k# ^" o

( r2 @7 n7 S8 S! J9 v; U在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:  z4 Q$ Z9 a. E0 g

% s6 n0 w$ V6 r ! _0 c: I$ ~/ m9 r& \% _! k
( [, U! f( T: K' Y2 F. }/ o/ @
我们来详细的讲解一下PHP中的命名空间:: l1 R$ Y7 g5 H3 ~  Y5 ^

. ^  {. X: ?. L' b2 p; i语法:namespac_e 空间名\空间名;8 [6 X+ {, i- @
- N3 q- M! A9 X( S+ u8 a( C' z
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:9 x2 r% b5 _" [! P/ t

3 ~7 T, `2 P7 m# \& w----------------------------------------------------------------------------5 Y) s- c: s: c  c6 j1 D7 G( r. `: g
! n' H% v/ f/ C# ]# M
<php
  {, \% h) I6 K1 a+ A+ |7 j( O9 W9 Q7 v  r+ ]+ b/ {
namespoc_e AA;
$ B" c' a% |  h6 R; C1 O, v; c1 xfunctio_n showInfo(){
( |2 y6 [3 C0 M* }' c; Q    echo __METHOD__,'<br/>';1 y$ T: P  S) I" A1 j3 k
}0 N; X3 Y; [& V" N! s8 U
showinfo();
  ^# q! @, d3 B) d' J" D6 b+ N8 o6 w& C* G; M# f5 ~
namespoc_e AA\BB;
6 Q5 T8 M5 e$ Q$ |
8 u1 X( d( \% a3 O2 t1 J0 B" sfunctio_n showInfo(){
$ l% U/ J: I$ D( a: E    echo __METHOD__,'<br/>';% Z* B- y% {; o' g
}# i  d! I  f$ q" ~  G$ |: O5 L" s
//showInfo();
5 Q# x* ~9 w; ?----------------------------------------------------------------------------7 _; [8 L& P( }0 Z$ E
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)7 M- C. n# [/ r2 y, P# I

8 T" \4 Q! h. S- x3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。. h( ?! p) c/ x6 P- n5 y9 H+ T9 F

( P% m/ Y6 i' [2 I. d----------------------------------------------------------------------------: _5 M; w( y( M- D1 l

' ?4 r4 w7 ]* X1 |) w! |# K$ B6 E<php% ]3 p1 ~) Z4 \
namespoc_e AA\BB;4 t' l# ~4 _1 f0 |7 X% M
functio_n showInfo(){
: l! E# Y# ]+ q3 [' n7 t    echo __METHOD__,'<br/>';) O) n# X0 s6 y
}
& T$ b2 I0 c' n; ~8 Nnamespoc_e CC;
4 ]7 O& A8 k& ~2 Z, a+ T& [& C5 [functio_n showInfo(){
1 T& E/ P( a/ o* g/ M: ^/ e    echo __METHOD__,'<br/>';: C" k2 K' }- {5 C
}
9 q7 y  t3 p" ]7 I9 W# q& C3 inamespoc_e AA;, _$ G& S& `/ M
functio_n showInfo(){
0 M- t3 u* t1 Q* K3 |( u3 |    echo __METHOD__,'<br/>';
) V/ T: L0 [$ c  }}
# C! b* F" z+ s% ]4 L" j//非限定访问:用于访问当前空间中的成员( ~3 H1 v4 D" b& }& J  {
showInfo();1 X# C( Z5 s# @' w
//限定访问:只能访问当前所在的空间的子空间中的成员
* S* m' M6 @- X' Q1 z  WBB\showInfo();
+ m% w6 q2 {  E3 a) U//完全限定:可以访问其它所有的空间的成员8 g+ g3 [0 k2 [8 u  v+ E5 D1 n$ P
\CC\showInfo();0 F# Z2 M0 ^5 w, t
↑根空间标识符/ P) k8 V) o3 T4 e$ A
----------------------------------------------------------------------------
( y) {2 z& B- p) I& x但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:( S3 X3 G5 U8 Y4 Y

. A' `5 U- z0 g当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)  d. I- D$ \5 W3 b* \' {

$ ~5 ]3 X, q9 i/ m# f) r代码示例如下:
2 {; h. V, S, }& Y' Z% X* D5 S
! {, H7 ^2 V# f0 H----------------------------------------------------------------------------
$ E" C1 t7 R3 u( ?( E% l% t$ U+ [+ K$ X0 p& Z& Q. c8 O$ B4 ?9 N

; o2 H$ i. W. u1 N3 Z% D9 S* ^! ?04inc.php. V) ^' H3 w8 _- r! i& U
<php  G0 k" Y3 T- V2 Z$ n# M; B
  D4 i8 \+ z, @! I- ?6 j: _/ ~
namespoc_e Core;+ m& O0 T" p7 T$ v
include '05ou.php';' n5 g( A( C+ v" f
new \AdminController();- L4 U8 x) X: w# ]& s  v
showInfo();
6 c! h/ l3 |+ e7 ?/ O
6 S5 F$ T4 }: ~/ Qecho P;- I) U7 I  l# m1 A$ r1 A" b0 R
//根空间中的成员,只要类的访问必须加‘/’7 r- d, `' y4 g) b7 J/ y
----------------------------------------------------------------------------# E8 \4 m5 S/ v- e6 t

, ^( g* J% ]8 K/ n% W8 A& m$ S05ou.php
5 s+ x+ a8 h  E3 l<php
8 p8 D. z& c0 [* Z8 ]+ qconst P=5;
3 S, h& Z0 u# \' \6 u; w6 C; r- W; Q* i
functio_n showinfo(){
+ j1 J+ P+ f/ q( i  P' [& T8 s2 c3 \    echo __METHOD__,'<br/>';/ }( \8 R) X2 g% d; U# w' x+ e! M- H
}3 f$ W/ b6 `) E
( {1 P- H0 D* y/ w: L
clas_s AdminController{/ w  L/ a% W, c# Y. ^# }
    public functio_n __construct(){
2 Z! S0 x3 t& D$ e; \; I& m        echo __METHOD__,'<br/>';
0 u- y6 T9 A4 }. V4 |7 m    }3 x: P; h! G+ A' r% C
}
) Z+ f9 T2 ^5 H, i1 u( a2 h
' r$ n. |0 X: h& v$ K第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。0 h, o4 N/ m: ]1 H$ j+ n# ]
----------------------------------------------------------------------------3 S* \9 s1 Y0 X3 A) N( M# z2 U9 l
04inc.php) }& y  J( z) v
<php
/ J8 }# j9 }9 I) h  G, T
7 V6 }4 Z$ ]; R) Snamespoc_e Core;* d5 ~/ L7 ^& I1 g  B! \
include '05ou.php';% o1 [7 F9 g4 M$ P0 c
functio_n showinfo(){
4 h6 D. k% N9 F7 M% m6 o0 Q/ h0 H    echo __METHOD__,'<br/>';
9 x8 \# x/ b, V. O}
% F# U+ h) O/ m  u3 u: q: z. P- |+ W6 L
new \Controller\AdminController;
/ x1 O& }' m, u: I9 c( P6 P----------------------------------------------------------------------------
" a; h1 J3 D/ P05ou.php
7 \$ `1 T' o1 t1 @<php
3 c0 b  [3 a3 L. ~0 x2 Mnamespoc_e Controller;, N+ l8 e) q( \6 E+ H4 x) e- I
9 n5 Y/ ]$ Q: ~( i* R- w/ i
clas_s AdminController{
+ f  j8 J5 V# a" C3 `        public functio_n __construct(){' h! T0 j: M# B: \! a  p  e
                echo __METHOD__,'<br/>';$ E% c! X* {. d/ A2 S& Q6 l
    }: y$ _9 b  J0 _  I0 \! o" l$ K$ [
}
4 O" V; W8 b0 |. F# G- j# k----------------------------------------------------------------------------" W1 x" }) }* I8 q" N( g) s
1 r9 ^4 L4 k2 N  E+ \6 _
4.引入空间成员:6 j" W1 U5 v5 x; }6 I

9 u, `) A! s/ ~+ l5 o. D1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 ?2 u, A! Q- K0 `4 F% U" H3 G# w# W7 L: h" |! \- M
----------------------------------------------------------------------------$ w6 i' z$ g- r5 u/ K
6 B$ k& c5 i7 M( W  ^. b" e
04inc.php5 s/ ^0 [6 Q8 Y9 F6 L4 n
<php
& b5 K1 O% l5 s6 Dnamespoc_e Core;
# L# m! R7 I8 E5 Quse Admin\Controller as con;
7 H3 }& O" s; I- K1 V% ^) f: s3 D/ [+ W: [% p# O
include '05ou.php';! B& `! D$ Y# E& n) A% ]! _4 G
. h" J9 S0 J7 U* O5 b( ~/ A
new con\AdminController();
7 y! V0 s6 j8 {7 k$ G: l/ W/ C* b----------------------------------------------------------------------------% @/ x$ k# m3 N1 l/ _
05ou.php
" Q. U  X9 n& J* F$ f* F' Q<php
5 c$ V- |, b9 k8 jnamespoc_e Admin\Controller;
- T" E: G2 `! ?  n4 c2 j% U9 K% u  T# B" s
clas_s AdminController{; W; L! v$ a) L3 }' m4 |9 t
    public functio_n __construct(){
" o7 U7 r7 h! g2 L5 }        echo __METHOD__,'<br/>';0 @/ y, K/ F* h8 R9 F8 Z- D
    }
5 k1 }. F4 }/ _}
) L1 J4 `  [/ j5 g3 K----------------------------------------------------------------------------
; B: K; J2 k2 i1 x; i2 I$ R3 ?- T2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。9 b0 _% a+ v7 K. ?, V7 u5 L; ~& t
7 h4 i0 E$ b8 u, Q6 S1 {
----------------------------------------------------------------------------
# f7 }# y7 |# R" h, }7 A  L) s  r& H% y: j, Y
04inc.php4 u) K9 `7 x. W' z" y. ^
<php
0 @* c! m6 S0 X4 p* k1 p//引入空间成员类
& c+ ^5 V/ A/ ]- q% ?
3 L4 ]5 v6 B+ w+ ^1 ^namespoc_e Core;- m" S" t& L) I4 d* T
use Admin\Controller\AdminController;
" W  X4 Q+ A: c' g1 kinclude '05ou.php';' c  W' j% V6 I; p
$ j6 N6 H$ Q$ A* r2 Y
new AdminController();
+ i4 o0 e( V1 R5 o9 M----------------------------------------------------------------------------
0 d) K! Q- _7 K3 s& n05ou.php5 w' V7 ]  M8 o
<php9 l2 l. }, a# @
namespoc_e Admin\Controller;5 Y# Y3 p- @/ r: x& l8 i

  U: ]- {9 S( cclas_s AdminController{* i+ R9 _6 l- d4 `
    public functio_n __construct(){! W  }/ {5 d& N
        echo __METHOD__,'<br/>';
$ w4 z7 z- h4 k6 w    }3 E& `  I9 _9 A- U( p) y
}
. f& E% Y# Z9 e, {; G- M: Q! x----------------------------------------------------------------------------
, s8 j( N9 H2 S' n, K! k5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。. k  K) A2 D' O: w/ L  @. v$ f

6 O) V! ]* a1 _! ~  g) Z( S2 q: P. K  v9 U, k0 R* H" b4 I
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。8 p0 X5 B' n- V% D  \2 D/ |

6 A: X  J: Y; A1 @; P" k0 v" b* E; q/ T+ g. o
4 r* E: p1 C6 q8 A3 Q6 m
1 i$ ~) V. r7 k2 p/ ~

) L6 l& x6 @. D8 {$ I% X; N* m6 r: @% ~3 H2 D9 N4 z0 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 00:42 , Processed in 0.131861 second(s), 22 queries .

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