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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:9 ^  c( n5 N' n- }% D

. {, E% e. n8 {  c* x7 o4 e! m4 ]在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
5 K& ^0 e) X( [$ p6 m7 d1 u
  b/ u  f& Y1 X! b7 M
% R6 w3 V) I& W7 T, v" P2 J. Y$ E: h, F& E6 Y
我们来详细的讲解一下PHP中的命名空间:
% n! g% b0 Y2 t. V  H4 E/ y+ \+ N; d  m, g
语法:namespac_e 空间名\空间名;4 g. ^5 L; r5 o! C4 J, ^

$ j% E# C* j. I2 P' d/ G: P& ~- o说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:/ |/ w/ D8 u5 @1 b
% S, z. N& [6 m+ w
----------------------------------------------------------------------------, I( a: \5 U( C2 u4 \

+ P/ Z4 Y. U1 K* ^' P$ R% N% a<php
4 Y) I" S- p( z5 n6 v3 _5 ~$ e- ~( }" w
namespoc_e AA;
  }  Y; D3 E  w1 |' a/ yfunctio_n showInfo(){
- S* v% D5 O, k    echo __METHOD__,'<br/>';
' b: G- @5 p3 ]# c" t}
; p, \$ K6 r5 I- z* `. J; q4 oshowinfo();
# L0 ^* q" b" w) S) i  I% w, O* O0 b8 z# \, K
namespoc_e AA\BB;
( \0 K+ C$ m1 k# |; T4 i+ U/ R2 N
functio_n showInfo(){
. p  z% {' h3 d) ], G% P$ F$ f    echo __METHOD__,'<br/>';3 n) g! D' ?3 R- a1 h8 o
}
3 v  p9 h# \% S8 A! n4 K//showInfo();2 \0 z" g+ _4 P1 b1 x
----------------------------------------------------------------------------1 _0 O4 V& H, e2 n
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)5 ~% e; k+ _, O; k

# e5 D6 A1 d( a1 a3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) f9 r0 x# }5 e% A2 j8 w9 o0 B8 |( H( F
----------------------------------------------------------------------------3 d3 T; ^! l! q

. D' x, _$ S5 L5 I1 l% q/ k<php9 ?+ @" m, r1 f/ v
namespoc_e AA\BB;4 y6 @! M" S( Q  b
functio_n showInfo(){
) M9 d5 j; t: N8 ^5 f    echo __METHOD__,'<br/>';
6 w' D8 I4 J7 x$ h8 O}
4 U6 |5 L. Z, L4 D/ onamespoc_e CC;
. s; h. j+ J* x7 J- ufunctio_n showInfo(){
% a; J# ]6 G. _+ |5 O    echo __METHOD__,'<br/>';
4 U- E! h% @3 R5 h* l$ N}  _& Q5 `7 S8 O7 t
namespoc_e AA;  |3 c& d) R/ l" Z1 I
functio_n showInfo(){
# D( ?' W( a. O. r. @6 c    echo __METHOD__,'<br/>';
- l1 p: s# i" u}
" W( ?- P( R% n$ _//非限定访问:用于访问当前空间中的成员5 `& G) @6 x/ m, E; I/ g
showInfo();
. p) `( }& {6 k9 ?//限定访问:只能访问当前所在的空间的子空间中的成员& E- t$ S, H3 {/ k- P' w6 W+ q& Y
BB\showInfo();! |$ ^9 p6 D( w
//完全限定:可以访问其它所有的空间的成员
. ?* E  H/ u) a8 b\CC\showInfo();
8 }/ Q: t% Y# K/ W+ H( q2 W6 f↑根空间标识符
6 v4 o5 M* y. A% c" Q----------------------------------------------------------------------------
& ~" U" h" O( s8 }  _) r4 o但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 y7 L) w* U4 Y) h' w
* e! ?0 J7 R. A8 d9 @
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
/ ^/ s5 K; `! U2 ]: T- Y0 t
; \- c' v7 T! }7 o/ e- ^, ?8 j2 C8 s代码示例如下:
2 ]  ^; ]8 `' Q
* J1 h# `9 [; K4 i' M----------------------------------------------------------------------------* L) f9 o) G" c/ L6 \7 |

0 P; G# O) l. j; W8 ^
8 m( i) V' U8 o" E# ]6 J! P04inc.php( Z& r- @( Z7 s: S
<php! x- R; f9 z; S- @$ |

, e7 C$ i2 M" R" J, ?: gnamespoc_e Core;* r) A5 P' B3 s2 P
include '05ou.php';. f1 I( g( w; P+ _/ r2 T
new \AdminController();7 f, g, ~5 W6 j  I: H  y
showInfo();6 n+ k! v3 M- I( |. \
; y$ Q: \- \4 L. z( D5 _
echo P;
$ ^9 D' r5 K; b# f. U% u//根空间中的成员,只要类的访问必须加‘/’" ~  x( b9 q# w) e/ p8 L) R, J
----------------------------------------------------------------------------1 d: k4 K! e1 b4 [. i# \5 A
  S6 R/ k6 I3 m
05ou.php
4 [5 ?. @- _* F1 }* d" t<php
6 d& |0 B( s' c% n, B/ s  B+ ^const P=5;; H5 t0 R- F0 L; `6 }% @' u0 N! {

; M$ T- y- L3 P9 z* q7 qfunctio_n showinfo(){
7 e1 x  ?8 V6 e5 |6 X+ [4 l    echo __METHOD__,'<br/>';
# b5 N5 L: ~* y4 }* r% ~}( \3 `' y$ v; @  v/ K4 y* Y5 a

, l, X$ [# z& r" M# I+ \clas_s AdminController{
/ x! p! M( |' f    public functio_n __construct(){; {& B( |5 P7 s+ Y; d* F0 B
        echo __METHOD__,'<br/>';
: T# j( o: i9 ]    }
0 n% P% J( c$ L/ x6 u}
5 m+ _, s( c$ _" K7 S# ]0 m( L$ }  C, ^; {2 u2 a; Y* F/ X6 Z2 x
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 V+ Z4 F' |" B  l4 m----------------------------------------------------------------------------
; h% ]3 d& Q1 ~$ W04inc.php, x2 t3 x% Q3 M2 x1 L$ T
<php' X0 z7 p4 e+ G$ I( q; {
' P$ t" b$ Y/ W& A5 f9 F
namespoc_e Core;
. K. i. w$ ~( X" F. h. a- X: B. kinclude '05ou.php';
; c% Q% f' `0 H8 G! ]functio_n showinfo(){
6 X7 L0 u2 z# l5 _0 M    echo __METHOD__,'<br/>';6 R. S1 \/ T+ N
}- s0 f: Q6 K9 v( N4 l. i
2 N  b# D/ ?$ C7 v& s
new \Controller\AdminController;2 a& r- B- ]  s. k; X) b
----------------------------------------------------------------------------
0 L! t  [+ D0 K9 v6 z5 k7 `8 j9 K1 y+ k05ou.php- T/ {, z. f# y$ y7 Y2 o! Q* H
<php
  O7 v3 U0 L" v6 Znamespoc_e Controller;
5 n5 _. H7 F: C$ ~$ B$ H* s  J" P" {! s; s8 {* ~* \  i' G
clas_s AdminController{- I2 ~! I9 L" @% s/ x& g  V
        public functio_n __construct(){* q8 B' ~/ S; X$ Y/ z* G
                echo __METHOD__,'<br/>';3 v1 ^1 [, ~8 b' w7 Y. C1 n9 y
    }) A0 @3 [. a5 X! ?5 C- E+ w. R
}) ]" A2 Y; ^" ~5 c: P4 u
----------------------------------------------------------------------------. J* y) m5 y, t- f( ]1 g

8 g& w' N6 `0 E- e8 O( _: k* u4.引入空间成员:$ B8 Y+ f( M: E. B  c

, l6 E5 M8 g9 A0 |) i4 p1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
! S3 E  j% G% v  M. u% H1 _
/ Y* E" N+ _. S9 w----------------------------------------------------------------------------
* x" y# ~8 j. f( e9 @5 N" `/ G8 e5 p+ U7 N, @2 Q
04inc.php5 b6 }  g2 _. O& [2 X! W* `
<php
  Q! e% B6 K' L+ G2 w; l$ V: bnamespoc_e Core;
! l, s3 f+ Y8 O* kuse Admin\Controller as con;) n; ]! q2 s! h$ v# R7 r; C
3 S' K7 h( s! x
include '05ou.php';
* f8 ~5 u' u. w& L& X  H
6 Z* s, V" A6 _. Inew con\AdminController();# v; W  G, I3 R0 G1 ]
----------------------------------------------------------------------------
2 _- O' p  A9 X, V8 u- O: s05ou.php
3 C6 \8 F: n( \3 _4 L8 B  S<php" u8 t3 A, D* o# w3 K; K
namespoc_e Admin\Controller;
$ f' h5 U5 r8 f3 A3 c3 K
" v" Q' u3 _; K# t4 l  Jclas_s AdminController{
- z9 n% ^" h7 T, X8 i    public functio_n __construct(){' t; a, s  F  R
        echo __METHOD__,'<br/>';
1 T4 S- A# X0 h- r    }
3 t: ?; Y2 b% E# }% }$ c}
! y7 y# J- L, x----------------------------------------------------------------------------$ E" d7 c9 W" a% z8 x8 X1 Y1 f  s, S
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
* e& O, A/ s, o. ^+ e6 X  D" P1 l6 i( ^
----------------------------------------------------------------------------) y9 n1 f4 M. a) q
3 u$ `2 C8 R7 h* Q+ S9 g
04inc.php
, i, n  T' \/ q1 K9 v5 ^% ?9 a<php# r) r4 H6 U! p
//引入空间成员类# x0 V( J% p: [0 O# G% A! P- U

' p' d0 p; A9 g, S6 J; mnamespoc_e Core;
- a8 H* O( S. ^- e! @  }* d6 Y: Iuse Admin\Controller\AdminController;
1 |- {, @8 k; D' o) C2 {) U! J. @include '05ou.php';
7 f, c2 b7 ~/ p2 {& l. |( T  z- Y# H- B) P# X
new AdminController();
; @& J. d# e7 A! c, H----------------------------------------------------------------------------7 a9 w. T8 V( Q7 W) v1 o
05ou.php
0 R; G& |- q, \<php
* r$ l1 H7 ^( v5 j9 k  v; wnamespoc_e Admin\Controller;6 [3 m* k! \" |  R7 r2 W7 E( i

! Z6 ~2 S. a4 P  T; Kclas_s AdminController{
0 W0 l. J3 Z, p5 T    public functio_n __construct(){% H3 F" ?9 l4 h3 S
        echo __METHOD__,'<br/>';
- i2 H. U. U/ h: `$ I& H& r% J- {    }
9 q: c* j# {5 Y. W4 E}
" j  c+ `+ }; J0 p8 K6 T4 O4 n----------------------------------------------------------------------------
2 q7 X( F7 x8 X. v5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。$ s% v$ w* T' h* J
+ s/ j% {2 P: n/ P

+ U% L5 ^- f3 x. b( C这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
3 i, {" z. q; ~& a, V" S8 w/ ~. w! w& K; _3 ?' {2 y

) A6 @7 c- \- \$ `$ g5 ~) d( P% q$ \8 _" t
! {+ q0 S! F7 c- A, o

7 ]/ Y& B* n( h. e* |+ W: Q  J, I  T( h# L) K" t: M! d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 21:42 , Processed in 0.123180 second(s), 22 queries .

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