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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:
: Q1 y6 R, E+ J+ W
" g: R3 v6 i6 D3 r. v; q在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
2 k& b$ ~2 i$ i0 ]5 Y$ D. T9 P' |' \. ^0 ^2 X/ p3 Y! s* P
. l( j: ~2 I, j" `2 _" a
( ?+ T. z( k0 j5 p' t
我们来详细的讲解一下PHP中的命名空间:
, @8 d6 J, ?3 [4 j5 H, ?4 b+ Z3 H0 |% n9 b- Q$ ]
语法:namespac_e 空间名\空间名;
& b8 e1 s7 H) ~! z* g# p! d% D: h$ f- X
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
9 R4 H# B6 `$ P! b6 s
/ Z& W/ I' i3 F  }& Y- X: q4 r3 N----------------------------------------------------------------------------: H+ u) L( D6 \; s

  r) ~/ p. C1 G/ H) G<php
' V! @' I) d. l1 Q0 b. w
# p! M( e% u9 I) f. Q% onamespoc_e AA;
- C, B% y- w* [0 Vfunctio_n showInfo(){
: X7 l/ H7 \2 q. T: K4 J    echo __METHOD__,'<br/>';- f+ V0 R: m+ B* U2 E
}* o+ n% B4 Y7 n
showinfo();/ _- |% p5 \$ \& @0 V" `

3 k2 W! P) z2 E% O3 Q5 g3 ?$ Wnamespoc_e AA\BB;
) m5 f) V5 e3 [$ y
$ o- K$ H2 c9 \% ^9 {8 ^  f9 Afunctio_n showInfo(){# Q: ]0 v1 L: Z$ O8 a$ d* _
    echo __METHOD__,'<br/>';6 ?! P- S! }7 ]
}  I0 z7 d4 P* S: U
//showInfo();2 V1 ~, s) f& w& Z, r
----------------------------------------------------------------------------
) a! c+ d3 G& _/ t2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 w2 ~( P( t  p2 `1 a, U  m- s- y9 F8 [: A+ M( `
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。  v9 \+ B9 k* R- i6 v

+ z5 k- B  w  |1 S----------------------------------------------------------------------------8 o+ l" b# T5 G; e

  `! _2 A$ H0 F2 m<php
7 w* k9 a3 `% {namespoc_e AA\BB;
: o/ z/ j3 r0 |. i- L8 L; Z+ ]6 @  _functio_n showInfo(){
3 ^) J( I3 E+ c7 M# P# C    echo __METHOD__,'<br/>';
3 D5 }7 z, _4 m( w4 g; f}. m5 a0 P7 T+ H; l
namespoc_e CC;
2 R+ p# d- Q8 _. {( Bfunctio_n showInfo(){  s- R( `, j( t; [/ i, C
    echo __METHOD__,'<br/>';
# Z5 a/ K8 W& a( U* e}6 R: c  X4 F% O; i: U
namespoc_e AA;8 t4 c0 ~/ q4 {9 d+ L$ h" ]
functio_n showInfo(){
! N; ]' y4 ^* \2 v    echo __METHOD__,'<br/>';. l' h- M- L; {4 D/ \. D
}) i# l# M) U, a! A. i. t
//非限定访问:用于访问当前空间中的成员2 V6 }) Y& j6 z; [! J! d8 ?
showInfo();
4 R' z; Q+ o; m  r% b. q  f//限定访问:只能访问当前所在的空间的子空间中的成员
) c7 r" H0 B! L3 zBB\showInfo();1 V( K& o8 k2 G
//完全限定:可以访问其它所有的空间的成员
2 X( u! i5 ~0 P3 v4 K  r\CC\showInfo();
. |3 y' v3 I( i0 x* `% d) h↑根空间标识符- `6 `  i! s+ B+ i4 }
----------------------------------------------------------------------------
* T5 u/ @8 F) O7 @, r  @4 b2 I& G但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:1 W6 q; _! P7 [# L4 v
- N7 m2 j- @' D. f- S6 a$ |; t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
( s8 S* Q) l5 ?" k' k7 n1 P4 L$ V" T! Z8 i: y2 ]( f
代码示例如下:
) H" y2 x3 A& j# m9 p1 F* B
/ j' N; Y/ F$ S5 a, s% N% X----------------------------------------------------------------------------
; N9 m# u* C6 I8 |  T2 g' Q6 e, K7 I* Q& Z

3 y4 i5 R' D; R1 e. e# q, v04inc.php  D- z  c5 R( T" o
<php
( u" D. @( O! K9 Q: t0 h3 Y' M( c" y" x+ c1 P, X
namespoc_e Core;& a$ y6 i0 \/ e( {; x& x
include '05ou.php';
; l$ L0 {  k" a" g5 K+ u- pnew \AdminController();0 E" M5 J; }; A$ |
showInfo();- L! V  T) h& _1 k' [
% {, R/ a7 r& r0 `- W" ?) O
echo P;
( d: i7 v; H4 l7 O( U1 p! ?" w//根空间中的成员,只要类的访问必须加‘/’
( g5 _# o4 u. t  v8 u! _----------------------------------------------------------------------------0 q# x, l# t) l, v" J: z0 ]/ W
& D  g0 O# Y6 e+ g' v5 b
05ou.php: `* \* J' A. B7 F5 }* l
<php
7 l( a& e) B# _# Nconst P=5;7 N( a- N: [* {; D: l

- c2 v# Q/ S- Z0 A+ \' yfunctio_n showinfo(){
1 S" P' R, P; v* }    echo __METHOD__,'<br/>';
/ H9 M- J/ U" c, \; q+ k( L  K}: B- c9 F( E; v3 v$ F
  Q4 X! W' m  ^& \* F8 C
clas_s AdminController{
6 S) P, a+ [  d; T    public functio_n __construct(){
2 S0 T% `& A/ U- D# }; U1 U2 v, M        echo __METHOD__,'<br/>';7 ^# m  y, U: `4 U/ i/ ~' C1 i( Q
    }# _% }; ^1 U; t- a% V9 \( H( T; V2 l
}
$ H9 b  i" K, P9 j8 r) g! ~
& O2 g- Z; I* W& `第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 |  l8 B% K; r----------------------------------------------------------------------------2 ?' b& f! @% u
04inc.php' G5 n1 e9 E8 f6 u! m
<php* N& z9 n+ j* ]. D; T" `

+ U1 [! Q! G8 r' K% snamespoc_e Core;
$ b+ y5 U' [, m. C$ xinclude '05ou.php';
0 W. e* J, B) l: c. [functio_n showinfo(){
7 p- _9 \6 c; A6 _    echo __METHOD__,'<br/>';0 Y, G! }2 j/ z1 h  F% ]
}% r; I' a; a* S! {
" O( D* B; |& W6 f: h( B2 V
new \Controller\AdminController;
& a7 u3 {; j" E: X; D: P----------------------------------------------------------------------------
1 o9 l" i, A, B  s- u05ou.php
/ ^- s; r; o  ^, S9 m<php
9 F1 o$ \% d; @' b4 O- Z! mnamespoc_e Controller;. l1 c1 r" u) V/ T* z9 j/ l! h

: L1 K: k7 z2 ~4 q0 Fclas_s AdminController{6 h2 s7 Z& C5 X/ q  E1 ^0 N. B! G
        public functio_n __construct(){
# U; a* e4 X( ]8 G; V) p5 R! T                echo __METHOD__,'<br/>';
9 N4 S! U: A8 h7 c0 [4 M9 H    }0 p1 r# o9 e' Z/ v) F7 _" n9 t3 ~
}: E- p7 ?% y9 p% J  t: j/ x* L
----------------------------------------------------------------------------
* \4 b: ~2 J7 V7 b5 {; e9 C# k8 f1 z
4.引入空间成员:/ P6 j3 z: b4 ]  O2 e( }

; b, a$ [0 e! ~" e: m2 r/ ^; B& r; h1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
/ o% q- r8 Z  f: D) c; ^: c# W/ Z
6 }: c/ r0 }' v8 {: @----------------------------------------------------------------------------
% y  M6 A, s, F/ v4 ~4 V
9 {& h" z" A. \" w* C04inc.php
" m% {$ `- N! L8 L<php
* Y; {) _6 G% M0 Hnamespoc_e Core;
/ X# m* I3 {, o8 V) G' ?use Admin\Controller as con;
  c7 e( [8 j- ~( @2 p8 s4 T  ^, E/ w; s+ o7 E
include '05ou.php';
+ Y! @9 D3 q' E4 F9 m" }
- w, a* k. t/ j! \new con\AdminController();; }, H# r2 ^9 C2 Z" G7 I! Q1 K
----------------------------------------------------------------------------# }) G) t& F9 o1 b
05ou.php
+ ?7 {& g& K8 N' H! T<php
4 X* K+ m8 ^- j5 knamespoc_e Admin\Controller;
& o4 r+ z. E& y; _# s+ A1 `% N% _% V
clas_s AdminController{
0 M+ W$ }4 [+ ]9 c! J: |7 N/ N, O( `- u    public functio_n __construct(){+ W' f; U5 J3 q" ~
        echo __METHOD__,'<br/>';9 f2 T3 B3 j' x& m9 X
    }
  D% X4 D  E, d* N( F% n}
" v2 ^5 h. l( w$ i----------------------------------------------------------------------------/ I( P7 I9 A7 ~$ M8 k: U. i7 z$ R
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。9 V% K) L: ]. n; V- G( N% L

. j" F& q+ y( r* X( l" [, n# `! V0 F----------------------------------------------------------------------------
1 D+ o, Z' q7 d# W: M/ }1 [$ V
6 R3 M6 W8 n# L3 y: {! n04inc.php
4 C$ ?' u/ V2 q- X' K1 J<php7 B8 x; I4 R% \+ |1 f0 p3 X
//引入空间成员类
; n5 n) g  j3 }3 d* N
/ R/ h  g( c/ Gnamespoc_e Core;
$ O, l  \9 d$ q2 quse Admin\Controller\AdminController;
/ b3 r  |4 z; {: s, T. minclude '05ou.php';; N! l7 u1 S: x1 M

$ d! f1 J" ?8 s* q  _7 r4 Wnew AdminController();
" i, g  M, m0 O& Z, f----------------------------------------------------------------------------
3 w' w. P- X; G# M; N05ou.php: Y% J, u3 x5 E! H
<php/ B; g# N4 _3 f1 H" Z
namespoc_e Admin\Controller;
6 W$ l, y" O0 O4 @2 z  Q4 g0 b- d, J5 l1 N
clas_s AdminController{7 m( X( Y+ L3 U
    public functio_n __construct(){  \* ^& S: j5 c" T) o- ?
        echo __METHOD__,'<br/>';
( X  {# Z# p9 [3 c7 E    }
! s; y0 o) S, j0 y0 I) Y+ b}
$ X! A+ _( n8 v% d5 p7 d----------------------------------------------------------------------------2 U$ H/ t& T' W9 f
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
6 r4 R$ T: ?/ J5 Y! s0 X: K2 x/ c+ Z* [. G

* |! K. c! ]  V" s0 ?# o这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。6 _# w# v8 b7 q

$ k( j* }4 O9 y6 F
! p8 p8 P0 b3 n5 y3 @4 K6 K3 f& [' [( I$ R, k/ G& S
1 e% A& z. y+ U; V) I* k3 R: [6 P

9 W% l% T" z8 Z  {& s/ j& z, y6 U" |3 E6 V% C, t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:38 , Processed in 0.124837 second(s), 23 queries .

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