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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
$ h; ~) V0 {& h: l0 X; N$ x) p0 a6 F( W# |3 }* p
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
9 P0 d  D2 h" \3 N' |3 C! D% Z3 ?) g& Y. r- i5 {. f

2 v  h) w# i' s2 [1 H
# N- |( j. w5 E7 p# k. E我们来详细的讲解一下PHP中的命名空间:# f; g' L7 j- T

1 u7 x$ P6 p6 N语法:namespac_e 空间名\空间名;" J; N7 o4 X% B4 q4 z! \; i

+ d! ^  z/ `" n* K. M1 U( r3 ?- k说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:* @8 w3 E$ D: x
0 ^. X0 ~8 i( T$ e! W! g
----------------------------------------------------------------------------( K# ^& G7 E, F- x0 h9 J( u

+ f1 w9 [; g: v/ I! \<php) f! X; |) i; f: I" B6 {" Y
& \2 p8 T2 w! g$ K  I. t; f
namespoc_e AA;4 l9 m5 K, n8 k$ K  F6 X; k
functio_n showInfo(){' t+ n. {( a5 W
    echo __METHOD__,'<br/>';1 f  a, ~& X% a: M- N( R
}! v6 f' L( ]1 x/ G- g3 j% @* U+ ?
showinfo();
6 u1 h4 m* u& p/ Z  Q: O5 P7 b" W2 S
namespoc_e AA\BB;* K* m, l9 }' m1 `  e$ E  b5 J% M

% k) S3 E/ O6 O7 X9 H1 _- p7 ^functio_n showInfo(){
5 o6 t% D, g: j6 v- T    echo __METHOD__,'<br/>';
! D+ ]8 {* G+ ~1 i  j7 Y" ]+ t}! o8 ~" {& [$ z3 }6 s0 T3 C% g" A) W
//showInfo();
7 ^6 b- d- Z/ F% q----------------------------------------------------------------------------4 T/ u* s% c) n6 K% \' x
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)  M! O) x- u( \$ v; f+ e" z+ `

' {1 j$ y- ?. K) v0 @+ \5 l3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
- z, d  s9 Y8 d6 s- ?  m, L
0 R; R% A* l' j----------------------------------------------------------------------------, Q1 F5 s* H# w3 L+ L# W

; S( U' x6 K6 |3 q! {1 n- z<php: \2 u0 h& u9 o# ~2 F/ v+ T
namespoc_e AA\BB;
7 i8 n& u) s- o: W' m4 ~functio_n showInfo(){
- Z1 Z: I/ ?1 }1 x    echo __METHOD__,'<br/>';: R) r2 H, r: Z& J! P, N# d
}' z1 w: h+ z1 l4 K
namespoc_e CC;
( H2 U4 b, }  @functio_n showInfo(){
3 c; U+ k. i1 c& s3 d: E9 \    echo __METHOD__,'<br/>';
) K* X9 I! m- V  Y& I}, f  z9 z& F! x, L/ F/ `
namespoc_e AA;
! `- `2 K/ O2 @) ~1 o7 |functio_n showInfo(){
6 y$ \  O  T" ?* {( j! T4 Z0 J% t    echo __METHOD__,'<br/>';
! r0 @1 h# j$ G6 _/ b}. z4 ?3 }  H4 x# ~7 M
//非限定访问:用于访问当前空间中的成员
* a5 x& C9 d2 [( K) k& `1 wshowInfo();! J* i; A% N/ ^9 Q
//限定访问:只能访问当前所在的空间的子空间中的成员% i: Z6 |* s% ?# E4 L  V" y+ j
BB\showInfo();
$ K5 C. v5 x1 g3 S5 n2 p4 t//完全限定:可以访问其它所有的空间的成员
9 u: t3 @) P3 `  W+ f! Z1 ?\CC\showInfo();# r4 P; S8 F( q
↑根空间标识符7 W) I) `7 e2 }# M6 W
----------------------------------------------------------------------------: U$ ^- u/ u2 c) x
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 p4 b; U/ [5 ^
6 [. E6 W# W) U6 T% ~3 L
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)* {; q: c$ k9 `# q' W  i1 y' N$ e

1 {0 r9 Y2 N: j3 v5 @代码示例如下:
- g* h7 ~# K9 t: K+ }- T5 p, A, F
: Q" N& z/ g$ L& p: g' Z8 }----------------------------------------------------------------------------
0 D1 D6 b0 T; j# S& c. t
5 j! w+ C. |& k
- T: l/ z- t- d4 n0 H04inc.php
$ ~( P  x# @( A& n<php
) w# U3 G8 F" ^: Z2 o; O' H7 {7 t
# k- ]" b1 j5 n' tnamespoc_e Core;
3 K. a% K8 y) h! V0 einclude '05ou.php';
5 L# E9 b" U7 V8 N5 O, i6 ]new \AdminController();- S- A" w3 q& _
showInfo();0 e4 Z% \7 P9 g. S% y

/ T; M( g* Y8 e) O; T& Lecho P;; f* P' d6 P0 q! c9 c; g
//根空间中的成员,只要类的访问必须加‘/’# q3 m! F. r; A- I1 p- ~7 R. |
----------------------------------------------------------------------------
# y3 _4 \" Z6 e6 \2 q1 k
. [; J0 F7 m7 q! r0 ?05ou.php" x! ^# i+ u; V5 e
<php1 W9 ~$ O! f! m$ e2 |" _) I
const P=5;
8 R- Z( P3 m! U) w& Q9 a9 C
3 k( f8 C. i' o- Z; b: qfunctio_n showinfo(){
6 |$ k) N' L( D& @! r) |; {    echo __METHOD__,'<br/>';
- z" [) q/ ~# r0 Y& t" A' K}
9 a( k. A" t7 G5 E% @) B: Z3 X
& Y4 N% `1 ~8 E& u; s5 Tclas_s AdminController{( u" w* O- \8 i6 B1 p) \) G
    public functio_n __construct(){
: `0 s3 T2 R/ z        echo __METHOD__,'<br/>';
. ~$ Y- ^: [/ b3 t- C    }& @" \! n' t$ I
}
+ A1 z# `! e" k$ i2 K$ J: [4 m. b+ x/ S: k0 V% x1 k, j8 o# D
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
+ h2 O# a% t& [% D- k* ~) u9 }----------------------------------------------------------------------------( N1 u' D' p# b7 i+ T7 f
04inc.php. B- v6 K% `3 i& @, _6 P" t3 C
<php- V8 F( a2 T& v! H9 \, k

8 m) ?% t* D9 ^3 Gnamespoc_e Core;
/ m! ^# E1 N. m  E  w! Q! Oinclude '05ou.php';
+ U% k% h3 I+ C/ t, C. Hfunctio_n showinfo(){
6 @4 ?, J! A% c    echo __METHOD__,'<br/>';
' Y) G1 c% n3 b( }9 w' {: T: L}) Q9 c. E3 C5 e% K
* B4 n- e) o; G' s) ^) l& B
new \Controller\AdminController;2 H2 r, T2 Z) Z8 F, l7 u& z! c1 E
----------------------------------------------------------------------------
  {' i& E1 s& `05ou.php
3 c" ~, s8 D* M<php
6 f' B* D9 A- V. w- \namespoc_e Controller;/ V7 J# Q# W2 H8 c" V& [; Z
+ v2 {( Y& G3 A6 Z5 Z9 A
clas_s AdminController{8 R! i: @$ S5 K3 Y
        public functio_n __construct(){& J) H' K, l4 S9 _, Q. K
                echo __METHOD__,'<br/>';+ s: F! d' |, `6 s# ^9 k
    }& t8 P' Q6 I* m, w  |1 u
}
1 A0 Z  ]$ c; z----------------------------------------------------------------------------
! I/ j# A0 Y2 o; I- T! {  ?; f% {
8 Y& D3 H1 X9 m1 U. X2 Q4.引入空间成员:
% W" X! Y- v* m% y  w" e0 \
3 e3 [2 o, w0 D" z1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。" H* Z0 `- u, s" f" g9 K* o( Q
) L# P' t, a1 E7 B8 G- Z
----------------------------------------------------------------------------) n8 p8 Y% e. m3 q; C4 Y
' o0 g  a6 X: Z: ^6 i" V
04inc.php2 T. n. E3 O$ x
<php% {  n+ r: ~3 r: j
namespoc_e Core;, G4 ]. y* h, A# E3 T
use Admin\Controller as con;
; C1 R+ ?' Y) t: Q# h/ X1 Q; h
2 b9 r) g; e! D7 R( {include '05ou.php';" [& Y- {$ K( t, Y
; d# P* ?% ^5 h- H
new con\AdminController();8 C7 l5 j  f" T6 G/ e9 g
----------------------------------------------------------------------------0 M  V# o6 `( C0 P
05ou.php
& H8 M% @) B/ J1 g* _" n<php
+ H& ]* f& ^8 l9 wnamespoc_e Admin\Controller;
2 @; R2 J) w6 T1 E& D& o/ V, d8 d9 D9 l! J
clas_s AdminController{) z6 t7 ?: G% d. w4 V; F
    public functio_n __construct(){) ?. C$ O0 c5 u: ?+ E* \: a: O
        echo __METHOD__,'<br/>';
5 K* i+ J4 A! K; U1 h. q9 T    }9 O) F0 v' b2 v
}
5 G& N) h6 ^$ ?$ l9 }----------------------------------------------------------------------------+ X# g+ ]9 ~- M) O
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
& a, |8 B3 }' [2 `2 \# o. {: X9 j' ^$ I
----------------------------------------------------------------------------3 ^5 ?! I! ^9 T4 N9 Q
  n3 b* ]; l  V6 `
04inc.php
+ X) M& T! g+ I, q' [( d) Q<php
1 H6 v' v: r0 B7 @//引入空间成员类
6 r$ a% O* W; v  i; m- Y, X, g
) X2 }' V6 f5 P; v# H0 v# x+ w" mnamespoc_e Core;
! G# N+ A/ V" h- vuse Admin\Controller\AdminController;
( J" r; ~$ i4 T# Linclude '05ou.php';
$ K4 R, k0 V) e& l0 z. L4 x$ A: P  {0 l+ J$ v- [8 d
new AdminController();
/ G+ Z6 h( k2 r1 y----------------------------------------------------------------------------
% E0 Y. x6 H9 [/ ~* c, L+ N: G05ou.php
$ q) q6 E7 @) ~<php; [; j4 Y6 S. k3 X5 i/ N3 e  B
namespoc_e Admin\Controller;$ U$ e1 q, O) F7 |0 I; ^3 |/ r" n
# j# b: q1 S- H4 s* Q- |( o5 X+ D
clas_s AdminController{
- T( ^9 \+ j6 ]1 k    public functio_n __construct(){
) w& _7 |- t/ `+ H0 o% w9 E4 {+ B        echo __METHOD__,'<br/>';; V$ A# i% G7 ^( c
    }9 O: G  D4 X2 N1 H+ K
}+ C: x8 Y; s" ?, ?# n' u, g8 h4 M
----------------------------------------------------------------------------
1 v# G/ c1 V/ K4 I, S( k5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。: ?2 W0 M$ C% Y; U* O

, O1 D2 O- R3 V
  j0 I; Y/ d) G2 p% J# ?这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 L- I* G$ G, F* j& A, _+ \1 R  _
0 V9 L0 n/ U" M% X1 c# n$ ]4 N4 `! W3 ?
  J1 {1 X( V0 H$ _7 p4 a
$ y( z' e8 i. r5 v/ A

, e" {4 n- Q% I2 o5 b; ]& _  ?5 C" @% N" ^7 ~: G" N- m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 01:06 , Processed in 0.122583 second(s), 22 queries .

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