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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
7 J, P0 ^) j. R3 J5 |1 O/ b/ g; ]
+ n+ B; ^" r7 R% Q在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
5 P% ~+ T4 @1 m* x, e) _$ `3 m" o! P, ]# q

" A, e) z1 S- z# q5 R
! S4 R- V+ }/ C, f& `: n) S我们来详细的讲解一下PHP中的命名空间:
& x$ _! j4 N( B$ O7 @3 N6 M7 _# @
) N" V* n1 ~4 @5 h语法:namespac_e 空间名\空间名;+ w, Q* C  s0 @- W5 G3 c
& t: J) ?* N' K" O
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 z/ M1 G& E+ l" G6 Z
. P  ~! U3 q* {" _6 }9 N
----------------------------------------------------------------------------: n9 g" _+ e2 l

- U$ n6 v( o! V' Z. z2 c5 Z6 ~0 `  x<php1 M2 ~" u, U- O; }0 P1 \
" }0 d) F+ z2 q
namespoc_e AA;; n. A1 t! ~' }2 @# E) @0 `
functio_n showInfo(){4 s1 ]  M4 @+ D
    echo __METHOD__,'<br/>';
% k3 [7 S2 H9 x) Z& {6 \+ K# m}
- o4 e% q# T9 J* q* [/ Lshowinfo();
  F( T4 [- `" g
6 T( V3 J* ]. P. ?0 {namespoc_e AA\BB;
- w) f: D' D" x, M( S. z" y5 I3 D; Q3 p  _
functio_n showInfo(){' r& z! v" j1 V/ H. G7 a
    echo __METHOD__,'<br/>';: g5 b( H8 Y% F
}
5 P4 d% H0 \2 p1 m4 S//showInfo();& P* ]4 _' E0 s: h9 W% b
----------------------------------------------------------------------------" a  T- A& s  Y& E3 N; y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
5 C+ e  g% ]& X. X0 ?7 ?2 t* f- x; D9 v" D9 v1 V
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。+ y+ Q6 {: B5 i5 L4 F

  j+ k3 g$ G) n) P* K9 I0 L----------------------------------------------------------------------------
7 n, \5 ^; o/ N, S. t
" a; F! d4 P/ v( k! h7 y<php* F- w- Z* h0 `3 _4 b7 }
namespoc_e AA\BB;
+ t* H+ T' X0 b) o9 F' n" `functio_n showInfo(){
6 w5 M% H" k3 N* q: k( g+ F3 Q0 I& h    echo __METHOD__,'<br/>';, ?! Z7 ^0 u, t/ Q1 `9 o
}
/ O# m8 \$ {, ]! y! Unamespoc_e CC;! f5 u4 D8 v7 k$ V
functio_n showInfo(){# W; ]  |! h8 r
    echo __METHOD__,'<br/>';
  c( c$ K7 ~# h! e* h}2 l5 H" o: b9 C
namespoc_e AA;
! o6 a4 a0 h  U! Xfunctio_n showInfo(){! ^2 r6 p) Z; \" ]
    echo __METHOD__,'<br/>';
$ ^# U3 K; `) h, A  h! \3 X+ I}5 U# v1 d2 H$ F# [7 y' L' t0 D
//非限定访问:用于访问当前空间中的成员/ e, q9 [2 M( g# l
showInfo();
: C$ Q' `! Z2 o. E//限定访问:只能访问当前所在的空间的子空间中的成员
7 [. e; D2 a+ R, s1 wBB\showInfo();1 b! y9 S4 l% l' Q$ i
//完全限定:可以访问其它所有的空间的成员
! o4 U- ]* x7 v4 f\CC\showInfo();! `# m+ a4 `- v% N8 x
↑根空间标识符
& f8 x2 j. A5 d2 _/ a5 g& Z----------------------------------------------------------------------------
1 S$ T& m! P0 z+ I0 j但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:9 Q. o8 R' h9 }$ Z. W

, P5 w7 e& B1 {5 }当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
  K, w8 X: j( c- K/ m* e$ N+ n% ]4 Q* q0 B+ ?0 v9 j/ W( a
代码示例如下:; @: d, o) A( E& t/ R/ Q0 x
' a. M; }0 b  e. n4 `0 u7 S
----------------------------------------------------------------------------. [0 X1 R% H  q% k- s- p( |4 g& P  W

3 K/ |8 `6 n0 l4 ?  ^  C" W  l1 J- @5 B% e) F! Y
04inc.php! j! J% f* `' s# G
<php
" `" Y( v& }" [" E0 b9 H5 u
1 y, C' B% x6 p" Pnamespoc_e Core;8 i, P, `4 u: c
include '05ou.php';
0 ~) k' n9 W$ B/ ?* Z7 }0 onew \AdminController();
+ f' W4 J6 L0 s1 [showInfo();
/ @8 b4 T8 H4 L) D! E# V  r) s% \- i
echo P;
0 E- B9 |# x6 Y* D//根空间中的成员,只要类的访问必须加‘/’- R$ E) [6 x# F% W: s+ ~' N4 U) N
----------------------------------------------------------------------------
' U; F! a& z; Z2 }( r) [2 k
7 f  }6 T/ S& x, d05ou.php. y$ i8 _. X8 G- g1 P3 L6 u
<php
8 s# i  Z3 S& Fconst P=5;3 h6 B* ]( g% k& \* ]" ?$ Z* S

: p' y8 A# q( O* K; w3 o6 \$ lfunctio_n showinfo(){2 b; x7 n3 L7 ^) Q! c
    echo __METHOD__,'<br/>';1 Z* H, J+ l8 w8 D; Q
}
7 }# ]& R0 J) ^
9 i2 ?5 H# \$ r" k2 k5 b8 wclas_s AdminController{3 ^, W8 P& \8 X  E4 Z9 y" D/ Z/ P
    public functio_n __construct(){
$ f& y* |* t; w6 Y        echo __METHOD__,'<br/>';/ ?, t' k7 T* x
    }6 H2 W: ]$ @" r" p
}( s' \) ?# k( O+ M" F% L% j' o  `( Y4 F
$ D% D% m$ }; L
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* b( P, p7 z$ h1 R----------------------------------------------------------------------------, z2 Y5 Y2 q# \! d) Q  t
04inc.php
, s" |; f* Y8 w. K- e<php
( p# c: ?+ G9 J9 W8 }3 S6 Q- p4 t- |% n* H& y! l3 F
namespoc_e Core;
8 Y* K  U/ r7 r3 ?include '05ou.php';
6 O8 f6 R( n( O8 ~& a- ifunctio_n showinfo(){3 }( b7 C9 q5 c0 U
    echo __METHOD__,'<br/>';' \% @' L( h' m) I/ g
}
- q  c3 R. W: r6 ~" H
6 i2 g% q* e% r7 c, |new \Controller\AdminController;
, Z- o) c- I- }- l2 L) \----------------------------------------------------------------------------9 T- `9 h4 L, z2 h
05ou.php
" Z( A" U6 @2 ~4 ?: p- t6 x* @% X$ }<php2 D2 r; |( C3 G0 k
namespoc_e Controller;/ B4 H$ Q6 p% U  k; {( f  c$ [

. [2 a- F$ n  e2 ~8 S) I6 W+ g5 `clas_s AdminController{
0 g( D; w) v$ j) _" B$ O        public functio_n __construct(){; f, |0 _# P8 m! C. p
                echo __METHOD__,'<br/>';  A) r- i! p; D. g. e6 I
    }* S" V7 ^9 P  u" W/ @+ `0 P6 C
}
! L3 O5 O1 z  \8 h7 k  s2 K) y$ k* Z----------------------------------------------------------------------------/ N" t$ b5 Y4 ^% w$ H

4 y+ d1 Z+ I& d' F4.引入空间成员:
- j4 d% |! Q* n! }
+ J, o3 o6 V' P( ?6 o  L1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。5 ?9 u# @3 J# v( U& T9 \( F0 u

7 B( ^: ^3 J" i+ ]1 z# ^) U----------------------------------------------------------------------------; B' w7 Q8 i* s: i

6 E! E0 B3 F5 P+ W04inc.php8 ]  [4 k* ]0 j, r5 x% J
<php* A' @' |  q, F7 d* E, U
namespoc_e Core;9 k: g! l; V# E0 V' x
use Admin\Controller as con;; P; L0 N/ G1 J1 H7 v5 U: ~

, @) g" \5 \! ?* minclude '05ou.php';
' J& b. [( ?' p7 K% v
& [. q% o/ r, s) R) inew con\AdminController();) R# \4 x1 ~+ a) n5 D) L7 v4 \0 c: n! ^
----------------------------------------------------------------------------  T) d3 R" m- t( d, E$ o1 U8 P) r9 h
05ou.php
. n; \4 d1 f2 V8 P/ }+ G  z4 v4 G<php
0 a! `2 O0 N( {$ Z1 P, I5 Rnamespoc_e Admin\Controller;
- `* L7 e- j$ K& P7 c. m4 z. L, s9 \; \5 D9 x! b# Z
clas_s AdminController{3 h7 W5 c; E" X. \2 g  F( k
    public functio_n __construct(){
" [2 N1 O- f9 o" M        echo __METHOD__,'<br/>';
! x* W  U- b8 L: ]8 `6 ?    }
4 v1 f. ~, L! f4 p& A}1 r1 V7 u/ w6 Y& f3 x
----------------------------------------------------------------------------
( _, z1 M; ], Z8 d  `2 i0 I/ w4 Z2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。' I6 l1 Y7 L' R# S6 R% A' \: M- S
+ [: U& `2 k& r: y9 [0 Y( p9 G. b
----------------------------------------------------------------------------/ V5 x( [# G4 Z( M! C7 X/ `4 \
8 t' b& v0 i8 |" n
04inc.php* Y/ ^% g5 W& u
<php
& G0 D  V6 ]: Q( S% O$ Q//引入空间成员类! Z8 {4 B" v8 `4 a9 \

# Z1 o- {+ p, b! nnamespoc_e Core;
7 b+ t( `4 y+ ~2 W+ _5 suse Admin\Controller\AdminController;
& e* h4 @" x. A# E2 c8 X0 linclude '05ou.php';
) h4 {( m0 J& g' O6 X% n; X# E; o6 i  H6 z1 Q/ p
new AdminController();, X/ o" U2 S$ ]1 e9 k
----------------------------------------------------------------------------2 {1 {8 z& p6 |; i1 B0 P
05ou.php3 y0 b4 ^6 k0 y  @
<php
; _+ h; u% p+ `# w* snamespoc_e Admin\Controller;7 Z" k6 Z& I( [3 D6 m! Z8 q( w

2 k7 x, e: H( F9 zclas_s AdminController{
2 }' D$ N9 i* k; ]2 B    public functio_n __construct(){3 R  c3 f% {4 f* \
        echo __METHOD__,'<br/>';& c# n" B- o! _8 N3 H% Q' [
    }3 U- ]3 F; B3 r
}
! C+ J1 f( m. P3 }* d----------------------------------------------------------------------------/ L1 v8 U6 O% |/ r
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
, _% D: s. H6 @! Q' K1 B0 Z  h* {# D0 ?9 p

: Q4 R& }% y+ f1 [这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 m, k3 z+ h/ n& q- g6 g
% m* C# X% m: g) E  H2 |3 q7 W: T) S# O" r7 q' G/ r8 E
+ F; ]* D3 ^! [% ~0 H  ~. b4 _
' r9 p: ?- |& y6 O

% s; c/ ]( V" O' ]6 V8 Y( e3 h! u5 L/ d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:10 , Processed in 0.131822 second(s), 23 queries .

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