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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
/ z/ U% x0 e: Y% X
8 |& C0 l, M) N9 O5 s在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
+ }. i2 Q% t7 C* K7 o
  _. Z3 U2 f9 q7 K9 w# m
; \$ V4 K9 \+ _5 ?7 \" e' N/ p5 ?# q: I& h, [# i
我们来详细的讲解一下PHP中的命名空间:% T9 r% s4 Y; }# }. B
9 \2 ^& c! F2 W
语法:namespac_e 空间名\空间名;
" R* l, j/ B2 S' d. \
/ u% I( ]4 b: y7 ]说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
$ I  N& |$ b9 ]7 N; |) |) |9 i  q8 ^0 K) X  M/ V4 A
----------------------------------------------------------------------------- K( j6 |+ s3 b
! m  ?) \% D- t; }
<php
& t2 a- K- _' t' z7 k; i7 \4 N0 B( h( P- [8 R/ v4 n
namespoc_e AA;( M- H1 |4 r; }: k7 d: V) t
functio_n showInfo(){
2 w2 d/ I! L) ~' y+ ?, `/ ?    echo __METHOD__,'<br/>';
" P6 E  Q; ^: z  N' q}* t. ^5 E8 I& O5 Y7 c) c
showinfo();5 L+ D! {: l3 @# T& ?; Q

9 p3 b6 Y& G) e) N) g# V- l  Wnamespoc_e AA\BB;
, w) e& e! j' S4 [# R& [6 H( R; a- G. h. G' c  z' K% E
functio_n showInfo(){$ n- [8 J5 x0 n2 h( z2 Z
    echo __METHOD__,'<br/>';2 p  {- T  n9 T# X8 z' ]' h
}
* S( \& Z; [2 R. C: j/ p//showInfo();8 v5 t( Q2 {% ^
----------------------------------------------------------------------------
9 Z( t- I0 _6 O2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)$ X5 w; d. A, k, r: n& G- b

' V( N- n0 T/ a( u3 M0 m3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
  F$ d# H3 I: H
" h3 y# t2 z1 i4 c----------------------------------------------------------------------------
5 A8 g# `( \4 F4 _  a2 A! B0 F, q: o  }4 @5 A
<php9 V' r) q# V& r+ M
namespoc_e AA\BB;
" A% E5 ~8 H5 j: afunctio_n showInfo(){( _4 B0 _$ F8 ~5 e
    echo __METHOD__,'<br/>';1 y$ G1 ~' A' _$ X/ `, @  n
}$ g' N, A) G- x7 }+ p8 b! a# z6 e% L
namespoc_e CC;
% Y! X+ R5 m! q4 ifunctio_n showInfo(){$ K3 U- U5 I% h$ S2 r' Y) |
    echo __METHOD__,'<br/>';9 d  c( b& M/ ^8 X% ~
}) o9 s9 ?! `5 h( ~
namespoc_e AA;* M' v- j1 H/ r5 ^, S2 O1 ?
functio_n showInfo(){- x1 A: q% A1 q7 t5 e
    echo __METHOD__,'<br/>';
) d& n" R1 c# `& {; G& Q& S/ |% ?}
* M- M' X8 e6 d0 _3 c5 @//非限定访问:用于访问当前空间中的成员" s9 \% W/ t6 F
showInfo();
5 V& j$ d6 b& D) l. @+ O4 q- }//限定访问:只能访问当前所在的空间的子空间中的成员
9 w% X2 n6 ^1 T$ p' vBB\showInfo();, S) x0 ~5 `3 D& o1 C
//完全限定:可以访问其它所有的空间的成员
- T' Q5 w8 W/ {\CC\showInfo();8 y+ B; I5 c+ U  S" Y: |
↑根空间标识符
& C0 n. ^; Y7 E. P) z2 u) _0 ]----------------------------------------------------------------------------
! B3 V4 w8 i+ z  A4 @$ \但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:0 |+ |% k7 V2 b3 p6 ]
# n- Q  b3 |# p. }; ^- M  r/ G2 w
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)5 ]2 v3 S) ]* k  f" F

# `$ ^- A, t1 z2 G6 B5 l$ b7 ?代码示例如下:$ O: V! e( b4 _3 }7 T4 n. ^: X
9 R3 J  e. g# k4 n
----------------------------------------------------------------------------, v2 t" ?5 ]# y" M3 m( C
1 k$ J/ f& x5 Q4 s, W, P
2 a9 g+ S; Q  t; N! D+ M
04inc.php
! B; b  V1 G3 N<php
5 k7 a  z: I7 M3 D8 D; C6 g  ]( \' f5 u* I* u
namespoc_e Core;( v. V. M8 U' r# L8 V  u
include '05ou.php';
; |( F* o7 Q- H3 b5 ^new \AdminController();- z" i9 e2 o4 [! R
showInfo();
$ r- _% e2 j* b5 ]7 t- e$ B8 t9 K
echo P;
# N0 b: v$ R/ _5 ?" u//根空间中的成员,只要类的访问必须加‘/’
& }$ D4 d: t" _4 f1 D* m----------------------------------------------------------------------------
6 o' o" p' Q3 J% K5 @. F0 ^; T# L4 P( B# J2 u
05ou.php
& b6 O9 C: @/ H: K5 L& l9 N: m<php
+ `" ]. P6 W7 F: q2 F7 \+ Rconst P=5;- J! t. z) @( ]2 J3 @8 V2 j
9 a" _* a' Z* K/ u; P* q
functio_n showinfo(){
' z! d1 A/ ?% g: f( P* P) f& z    echo __METHOD__,'<br/>';
3 I" [( Y, E* b}: K9 y6 y( a# r' c! |3 Q: G
3 H7 W4 ?. m4 E6 w5 Q. @; }
clas_s AdminController{+ D6 |; F' U/ z  d
    public functio_n __construct(){* k& W* f  U+ ]8 X" v+ g7 {2 J5 _5 l( B
        echo __METHOD__,'<br/>';! ^4 P8 q1 _  H; J
    }
  G5 o7 X6 v" p, q3 |8 [- l8 I6 }+ F}: m) n# Q$ I8 C! ~" W1 A
6 @. ?) _+ {. U- U1 U/ e
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. P& L/ F2 ?/ d+ f3 @----------------------------------------------------------------------------/ }1 G$ n2 u2 C" W- q  _. Q0 i4 |
04inc.php
. Y3 J& V9 w5 ^2 f% L<php
4 d8 @. k# d; f4 J5 O/ d6 r3 a' d  t$ n
namespoc_e Core;
  j/ ]( X- d" `" Z7 `( S" winclude '05ou.php';
! ^0 {+ x3 j2 W4 [functio_n showinfo(){
: x! F# |! d9 `7 j1 m* U    echo __METHOD__,'<br/>';4 F& l( m4 u4 A& E/ p5 }  j( N1 Q
}
7 N# h& c. H: t5 I9 _& g5 I9 R' o% X! d/ e1 m& D; [
new \Controller\AdminController;* ]: o/ T* A; [1 ~& C( v
----------------------------------------------------------------------------- H5 ?& V- P# T
05ou.php, |8 [* [+ X3 _$ i9 a3 r& [
<php
. X3 \! y" x" @* B8 J4 i' w( anamespoc_e Controller;) S- H5 g, s) J3 ~6 f
  Q) q5 Q% _) W  G4 R& D
clas_s AdminController{
( z0 [2 ?3 F% r2 w% E5 N        public functio_n __construct(){
* ~# j1 ~; ]% d" V" H- b: M  e                echo __METHOD__,'<br/>';
* J" U1 {. e/ r" @8 B& i    }& E7 z* `: w- x6 Y
}+ o3 P6 t0 b9 e. L" L1 r
----------------------------------------------------------------------------% l- F1 Y; _! x6 k3 ~& m0 k
. F4 P7 Q2 v5 j
4.引入空间成员:9 _1 K: o/ Q( T; e8 e; Q; x# z
& n2 E* l0 z+ ?. _9 G& k
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。/ m4 w+ p1 F% C2 w, j% e* S

) @+ R. g: N" x----------------------------------------------------------------------------
- G5 Y1 i1 |0 \$ _( L; g& q  P1 ]
04inc.php
  _4 f) N. Y0 p) i2 v+ S' ^<php. n: {3 q5 x* _: S, [# A
namespoc_e Core;
6 G3 u# X- o& R' `" z% }) Tuse Admin\Controller as con;! P$ j8 f( J! {' _) x) b8 M
  n4 ?( W. {4 ~+ j. E. k4 p
include '05ou.php';
9 ]6 l/ Y/ E. f) g+ V
4 S2 Z8 z# w1 j5 }: Z3 P- qnew con\AdminController();0 D. L$ w- v0 |7 [: x/ h6 ]
----------------------------------------------------------------------------0 K) O+ f) S2 f' |: |: b
05ou.php$ h, a4 c5 A! f; C$ F/ d+ m6 l7 P+ D
<php
2 n6 m5 I  ]$ f+ Y3 cnamespoc_e Admin\Controller;
4 w! T3 q7 k6 Q# ~) Y5 ^2 ~) R0 ?
+ \5 q, R  f" ~/ k: lclas_s AdminController{# M  F, \) g6 J+ \- I" B
    public functio_n __construct(){- J& O4 d3 H1 u. w& h
        echo __METHOD__,'<br/>';( z% n8 j+ k9 f, ]
    }
0 V( H8 J# n, V# k8 Q}5 J: L! W# t8 z6 G
----------------------------------------------------------------------------
2 a8 j2 p% R1 l2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
* ^) t4 B8 H4 y* G* H; H9 w
) \' n" k5 M& g& n  w8 M----------------------------------------------------------------------------9 n( l1 x, |: S# z7 L) o

' D1 M# a( g% I& P04inc.php6 p; \; s' S, s% o" t' u2 o; M
<php
* T" n% N# M; ?//引入空间成员类# S. B2 p# S. f  K/ m8 [

* j: ^! _' U& z4 Tnamespoc_e Core;
  O5 c. n; }# a9 d( P) E! huse Admin\Controller\AdminController;
9 C& K! d1 o+ d3 Ainclude '05ou.php';
" Q# J  ]7 P- B' F. R/ D/ M' ^# r
( _! \& m6 Y, U7 ~new AdminController();9 \: w8 f) \$ M3 K2 u
----------------------------------------------------------------------------' _( g- c6 D  N" M
05ou.php1 i: H( P/ D! @, ?* m
<php
. g2 g( K* D) o( F# Snamespoc_e Admin\Controller;9 x: j2 j$ n& N% Y( Z
5 E& D" _  |+ ?( p( M  c
clas_s AdminController{8 _1 T1 }0 s+ H5 D1 M
    public functio_n __construct(){
- M+ |# T/ s1 S: ]3 M3 W        echo __METHOD__,'<br/>';9 p' b  O- A5 k; z; I+ T
    }$ f" A% [5 `1 M/ _
}
( I, r5 @$ {2 w2 `----------------------------------------------------------------------------
- f1 o( z3 @8 ?! z1 ]* q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( \( t7 G5 Q0 s, K4 Z& _
1 j" x/ [) Y. P4 T: [: _! ]. Q3 l8 a6 i% u6 l5 N+ h
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' }: M0 I3 s  ?2 Q) H/ r9 n/ [# Y" j/ @
, B' K: m3 t" `/ _( D
" G3 ]( |' `5 W# Q5 ^/ I
) H) d4 N& X' B  U5 n
- O9 B; i( O1 |: |. N* B

" T! Z- f) e2 G4 N  n; i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 05:19 , Processed in 0.068128 second(s), 22 queries .

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