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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
/ B) ?" _0 v, s  H5 T! |* w, w6 [/ I6 x7 J0 D
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ a; w) F6 O3 I1 N
5 P& |; L( o) K
+ V, _( f! N/ M: Y

5 Q, u4 Y  R! M& t: }. F7 [我们来详细的讲解一下PHP中的命名空间:
9 c6 q$ p2 n- a' @
' R$ j% O9 [" u' c. D" Z+ E! W语法:namespac_e 空间名\空间名;
6 g" W$ N% G- M! C( M. E
8 j9 r4 u) g4 R& |1 Q3 V说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:& e' Z* L- N! z9 `# W
: J4 g* Z8 q( u
----------------------------------------------------------------------------
% J# g; p7 K$ M% {8 o5 z, ]& O# l
+ j; P6 B* ]  U% |7 w6 f<php
& g3 A4 `& D# y/ c3 ~
. A% `$ P6 s8 H7 ~& C- u1 c# W3 ~namespoc_e AA;
2 A/ `. g% \. F! Q% Nfunctio_n showInfo(){# N' q* B+ A  {
    echo __METHOD__,'<br/>';
! g8 i& D- s. j6 _% E/ s/ g$ @6 {}, n+ q/ Y+ F' ?
showinfo();6 K& G( y& V2 E4 X3 o% M
$ T6 S2 N. d' w/ e, x: W
namespoc_e AA\BB;  Q- Z: j+ B. D$ \! S+ ^6 @
% N( U4 f# ?6 F' h3 i2 v
functio_n showInfo(){7 X' y+ F9 n4 H, n; R$ V: L& K
    echo __METHOD__,'<br/>';4 f; e) A( j2 L# }6 ?3 Q
}
5 l+ A0 E% G* A' L9 c//showInfo();/ ?. Y) ]' L# b2 v# n+ B; t% t9 a1 P
----------------------------------------------------------------------------
$ l4 |4 C& W' T9 b+ \5 C6 B2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)  Q- s' T1 b' A' v1 D" ?
% U2 h/ {! T3 Z6 O# ~7 V
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 ^2 C8 ]) z6 {  A/ ~
# p3 b& x" q7 R. r
----------------------------------------------------------------------------
; Y+ E& e/ @( ]) \- Q
* J6 I* F4 Z9 }<php9 ]* T$ x* E# b1 B) X& y/ q
namespoc_e AA\BB;
4 `8 y# s1 ]( K, gfunctio_n showInfo(){
% V( l) F& x2 G7 l: Q4 v, ?    echo __METHOD__,'<br/>';
4 k1 H" r' e1 a5 O) z6 A5 C9 d) ]}* c. }2 m) u, i
namespoc_e CC;" v4 A. \7 @/ u, r
functio_n showInfo(){* n. ]# F) v# ]: R* I" S
    echo __METHOD__,'<br/>';( [5 z4 f; U5 L6 _
}
1 ?( Q' o3 ]4 K7 a4 h! qnamespoc_e AA;" Z( W& ]7 l& r. p- N
functio_n showInfo(){
" Q; |) x) n- i; i    echo __METHOD__,'<br/>';
6 N- @6 P$ U& q) S}
+ P: W7 H; Z) H//非限定访问:用于访问当前空间中的成员
% Q% p# {2 }# XshowInfo();
6 y1 s  ~# _& z, g- @! H9 U//限定访问:只能访问当前所在的空间的子空间中的成员
% ~! [0 b: q5 v! w7 @BB\showInfo();  K; P2 G: J  i' D
//完全限定:可以访问其它所有的空间的成员# A! `% i" D9 [+ B% F1 }
\CC\showInfo();/ w5 X, A9 A3 t( }
↑根空间标识符
  W7 T* ~0 l  z% z----------------------------------------------------------------------------) W. \) g/ D+ W5 x: `
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:. L6 B" o3 {  J6 t  V; @( W  o
0 o0 ^( J) C" [  @: X7 t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
" S* S6 E/ @, F. N% g$ X% I* g7 a7 k5 T, O0 b( I4 {
代码示例如下:
6 e8 S6 ~4 G( l, P$ `9 }
/ ?$ M5 a$ N& z  }' j) a----------------------------------------------------------------------------
+ [- y% f9 t) x" \+ A  r' q' B" k, ^' T1 j, o5 g6 W& ^$ L
# ~1 [. v: f# ?9 W$ z
04inc.php
2 _3 N. m: S4 o4 a" ?! b<php
3 `/ W( Y( K: T; W. P# o( C8 `5 w$ X- }  F* _
namespoc_e Core;9 q5 Y. N- Y% o: o0 F- N9 R
include '05ou.php';
# `" Y( }1 \* m; A9 Q& mnew \AdminController();
# j- D% P+ _" q1 B# ^' @showInfo();4 s4 [) q; |1 G4 j( K2 M& g( ]
& u- b. x% M' A
echo P;% z1 r: ^$ C& u' c; [
//根空间中的成员,只要类的访问必须加‘/’
2 j# |6 R7 e- J' z) o) G, |----------------------------------------------------------------------------- b) p# {$ p) C4 E8 U
1 z" z# U5 e- {' T* ]6 |. J- n
05ou.php7 r+ |. i+ q& Z4 ~- n+ Z* Q
<php6 {7 m* i1 B& A, l% ~) X* F
const P=5;
6 R1 R9 c; K' s5 \, s2 }3 w) K
9 r% d& r5 P6 J) S( t, `functio_n showinfo(){
, p- W6 x  r3 P( V6 ]    echo __METHOD__,'<br/>';
2 I& u$ z2 ~' K$ Y( Z- _* z}
# O5 ]; |- g$ z4 z( N6 D! i2 h' U! ^& _6 Z! ~: H$ ?, f3 I. T
clas_s AdminController{
0 O- e. v( x$ c/ H    public functio_n __construct(){
+ W, E0 C- \" S, V& B        echo __METHOD__,'<br/>';
2 B5 L5 U0 J) P2 w: W    }
6 M2 E4 M. o9 u) l# |' {}
- Y, k7 H! ^* T
5 }" \# ^4 }( Q4 R5 K& v  f3 x第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
# x& `( [. N. L$ v0 l----------------------------------------------------------------------------
; x, u2 k" N" p04inc.php
: ^1 J/ h# B" ?, P! c. q<php/ K- _! @4 C' s" X5 F
& r: ]2 K! o  s9 S/ l( ~; [7 C( c
namespoc_e Core;
! c! i$ O! _& w6 \include '05ou.php';) J& |6 {6 C/ @9 L! m& w
functio_n showinfo(){, Q3 u1 P8 C' L- n5 q  \, Y
    echo __METHOD__,'<br/>';
' B# {2 g( [1 w4 n}
; Z* }' a  W- I
- e. ^7 R. Z' v. \/ N' ~2 R. enew \Controller\AdminController;
, ~- ^6 h. k" }' |' h5 `----------------------------------------------------------------------------
/ c" u# W3 B3 c/ t6 y05ou.php$ Y  J/ q/ k) G: ]9 z) z+ x- I
<php  T5 C' O5 w3 M/ U1 i' R& {$ O
namespoc_e Controller;& @& C! b9 Z$ z3 z' p" P
; J( ?9 h) i$ H' b! n7 Y
clas_s AdminController{
. u" H, q5 H) F+ _" ]0 I: l        public functio_n __construct(){3 Z) G$ ]  q. [9 P4 ^, g2 u8 y" }
                echo __METHOD__,'<br/>';
  d0 t6 t' e8 x: n" C+ U( q    }/ f' ~+ F+ F) u% x4 u$ K
}
4 e; J- x; |. _, r/ X- M  u) ^----------------------------------------------------------------------------* x/ f4 N1 O, U1 }! q0 ^
1 h' h0 o! J, l
4.引入空间成员:  x1 {: S& N5 X; R

; L% z9 D2 A' m9 o; y+ v9 T# _* l1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
5 s6 i$ k9 z( F9 d, `/ m
2 D% a9 Z& v4 C& \2 D5 A$ g----------------------------------------------------------------------------8 z3 x8 L& d0 o/ P4 ~+ p

( y0 H3 e* l2 m! I4 Z) P  ^04inc.php
; n4 D; O  _( d<php
, j& T; h( {( p' L7 d0 pnamespoc_e Core;
, q2 a& c9 t3 ~use Admin\Controller as con;; @1 j3 I9 ^& k7 t' Q. Z* J! ^+ L
* V2 q6 G" V3 c; {* z6 s
include '05ou.php';
& ?- l5 J3 B! R0 L9 Z; Q: X7 r) f# h
& W3 B2 c* n5 s# p3 Dnew con\AdminController();  H$ o6 U. K( @' i' H+ l: J
----------------------------------------------------------------------------
3 I5 |5 y8 b- B! w8 E& B2 F05ou.php) K* d7 Q' J+ O
<php* f% V4 l3 h8 ]6 ~. F
namespoc_e Admin\Controller;
) d: r7 ?9 B" y) |
  |  e3 }8 t! w- H' E3 E4 L1 Tclas_s AdminController{
+ s$ i% n8 L+ n    public functio_n __construct(){
" Z4 k: A4 n7 J( b, W% h        echo __METHOD__,'<br/>';
+ _4 e8 U* x, }3 E+ a    }
( x/ ~% P6 G/ W9 l}
* O7 I  E0 \# G# T: t" j----------------------------------------------------------------------------0 v/ t. P2 i# E/ D* B
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ u4 y" T. t2 q* R% X
+ Z: F# R, Q, H1 h* o----------------------------------------------------------------------------, l  m, T" }& m2 Z
$ e' R+ i) J& U& c3 N. L" M" u
04inc.php6 c9 @! g- e( O/ A" D3 R% A! {
<php
9 t0 C  F$ `, H: m& C. L8 P8 n//引入空间成员类7 ~% \) l! W6 C3 P$ Q* ]" _4 _6 A

/ T7 W2 m5 w5 M$ e, E# anamespoc_e Core;6 d( p) d. P1 h! Z1 e& R- m
use Admin\Controller\AdminController;
% Q6 ^& I9 c. }. ~# X" t( Yinclude '05ou.php';
: h6 X9 a; g0 }2 w7 }4 Z2 H8 T# j' v& M; j- G# O
new AdminController();1 k% V8 k3 M2 d, C
----------------------------------------------------------------------------2 w9 ^2 c) X4 D7 t! s5 G
05ou.php- o' `9 S( _, N/ G
<php
' C9 M4 o/ p( x+ _' q4 g; Znamespoc_e Admin\Controller;
8 m, P; F5 m5 R8 t1 m' w! h8 M% A9 j; k7 ~( v
clas_s AdminController{
. E( D1 H5 [- v9 t! c    public functio_n __construct(){
4 y0 R& f3 O' u0 q        echo __METHOD__,'<br/>';
. a/ F( S4 k5 U$ i" O" X0 c0 S0 T    }
  X0 a, @' i7 q# J' z}; |2 t8 ^$ j; n( v6 E0 {) f: v
----------------------------------------------------------------------------
9 V: ]4 I$ d# z* I0 H& l5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
7 I4 G0 s# ^8 S# m6 T- T9 ]0 H" @" l- B

9 h/ Q. ~  v% ^0 \  S: o这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。( P* w2 C6 e3 R  F3 s+ x3 i5 y$ E5 ~

6 w3 n8 ]- l% B: ^2 g" s. Y
! Z. Y0 I1 @0 {# n3 q$ K/ n# Z$ n
( N% b  d, ]# ^1 p- p/ y2 {
% m4 d* `: \3 I2 k! x  l
1 L" m% j# q8 z( ]' h3 g4 g7 Z& W; ?8 V% r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:37 , Processed in 0.068404 second(s), 23 queries .

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