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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:* R6 P8 K' c, w; c) h) D& _. v
! Z; Y1 d4 k1 e1 H
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:  B& W! {7 r9 @* O* ]6 a

& u1 u" I; k# E2 ]! x/ g7 G+ @1 B : L8 E9 X- E+ K9 ~

) m! f2 Z* ^$ ~/ \! W, K我们来详细的讲解一下PHP中的命名空间:
! ^& s& N7 W7 X) u* B, k1 n( [
( P. v/ D# S+ `; r! ?语法:namespac_e 空间名\空间名;; {" R3 K+ s6 j4 d0 ^* P; |% P

- }, u6 ~' U+ P! N3 ^0 C1 Z0 e说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
; }6 @2 [+ |4 W9 P, Y, `
- q% y' Y# b7 m0 A! b4 R----------------------------------------------------------------------------
$ e1 [1 h% @1 m4 g% A6 K& Z9 f8 s0 P) W2 z% K- P2 o
<php, N2 f4 ~3 y/ a+ z% V3 s

$ j+ B6 u! W, C  c5 Anamespoc_e AA;  D; R& P8 V4 J: M
functio_n showInfo(){  f+ K% ^. b4 q- j$ ?
    echo __METHOD__,'<br/>';
6 d3 I5 x5 L# P) n' n+ b8 Y6 P}3 v; ?/ x+ g3 x8 Z8 A
showinfo();4 V' D+ ?1 K8 V: I

* w8 u9 h- U% x2 |8 rnamespoc_e AA\BB;% p+ f. N$ o+ l5 l8 ?

: @$ l( n" r% [functio_n showInfo(){
$ H0 f/ S# j- o6 \" S9 A4 z0 k    echo __METHOD__,'<br/>';% s) Y0 n: G$ G. e% x# G/ \+ _$ D
}5 z$ q# h1 I" I2 T0 I
//showInfo();
/ ]1 S/ l/ i- Y" F----------------------------------------------------------------------------
; y; ]; P" {" b8 O3 g; I2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2 G" z1 c: {! t) ~; F
  C& W0 L9 J( P. O0 ]' D3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 F4 E+ {( p/ |) T# N3 H  M9 p

7 g8 u8 M6 @6 ]. L" @' E----------------------------------------------------------------------------
0 g& i- n/ ^' e# t; Y4 Q
; [: `) A; @7 K3 l% B! F<php
' B" Z1 R9 V0 snamespoc_e AA\BB;9 q2 l  V$ E3 D; K5 L/ r; L# o
functio_n showInfo(){2 t( B, T3 y% _6 J' i; O! x
    echo __METHOD__,'<br/>';$ {) R0 G' C" M- U3 y) F- N6 l$ @
}
9 H, b( k/ `0 P3 ^$ D) ?; t  knamespoc_e CC;0 p; H! u) h- z7 L% j
functio_n showInfo(){
5 B) ~3 k  P4 u/ Y    echo __METHOD__,'<br/>';( B4 f& p3 i, J  r! W
}
" j' C6 m( ~% Q9 i, Nnamespoc_e AA;
+ B6 u7 w% G: i7 lfunctio_n showInfo(){
9 ?0 C! m1 L" z0 G2 {# I9 s    echo __METHOD__,'<br/>';
  C$ ^5 u2 J# U4 ]9 `}
+ H* `, l: _5 D//非限定访问:用于访问当前空间中的成员  l3 i1 M) ~4 C+ U' K5 x. f5 W( @; J) w
showInfo();
, V+ e" c: i" R% S//限定访问:只能访问当前所在的空间的子空间中的成员) v! N4 t7 S" T' {
BB\showInfo();
& A0 ^: o. E0 W- f$ E//完全限定:可以访问其它所有的空间的成员
1 j1 d# K2 l% Q$ Q' _* K+ u' M3 U6 E\CC\showInfo();
1 _. ?* v3 ~4 c2 K6 z8 Z6 V  _6 R↑根空间标识符& f7 u5 R3 h8 }: R7 d
----------------------------------------------------------------------------3 g& Q' q" j0 m: K. ~4 q* e& P& }
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
) V# I4 ~% z: H
5 F, e& m9 K+ S3 G4 z; P& I当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
* f7 L9 D: E' Q" h# D: F% T
/ X* B  V- c6 v5 ]( k代码示例如下:
6 @0 M8 X0 q6 O0 Z1 h9 i- \
9 i5 f" D$ i# V# _. v----------------------------------------------------------------------------# A# Z+ X0 H$ g0 n/ e1 h

1 N& t+ o- N" A9 u! U
9 U' o/ E* f5 j, X/ g$ T04inc.php
# E. S0 N9 ^+ J<php
* _5 S3 W! Y" s% K' T& P5 r
/ C  u- b: }8 p. }/ B1 D, k" S) anamespoc_e Core;+ M; R; t: l+ U8 o1 `7 ~! |8 C0 x
include '05ou.php';) D) y5 F# T7 g+ X! k7 J6 t/ H: t( t
new \AdminController();: O$ y% w( J% [8 ?+ T- d
showInfo();- @* l% V: c& o! c& {) T
, h7 a5 h, B- e6 U
echo P;
3 B; Y1 ~* N4 q8 h# J1 V//根空间中的成员,只要类的访问必须加‘/’2 `6 L* ]1 O) T  w4 ?0 J
----------------------------------------------------------------------------6 N3 N5 M) e9 y2 D  W

# |, k- Y/ l8 ?$ V' s; [05ou.php+ x9 ^7 S' T/ z0 w% ]) k
<php
7 w% V! B4 u1 p5 X/ wconst P=5;5 m& C. h+ S' H8 I! p: _7 o
9 g: j+ M3 Z% H, o! ]
functio_n showinfo(){) e0 h2 o: l# X* l
    echo __METHOD__,'<br/>';
, p9 ?% Z  f" K" o}) J4 f9 Q; e, [. l* M
  V/ _, E' A$ i7 j0 u( _
clas_s AdminController{: O9 U! c$ x% I( _8 s+ [
    public functio_n __construct(){
# W/ A" J. Z) M9 y7 I7 d        echo __METHOD__,'<br/>';
7 B' m" a; \7 i; O5 A5 I0 T" a6 K    }- f' ~+ k8 J! C+ x8 M; W; M
}
  F  q+ w& q! V( ~
' M6 n1 a- x  t3 G: d5 g; n+ ^; \第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
+ I  s3 [/ ]+ h; v7 b5 K----------------------------------------------------------------------------) x% Q1 R+ |  r- ?" R+ ~
04inc.php% `1 y* a: }) L( @' f% X7 {
<php2 ~1 D& ]# Z& p  u

# r& c* \( x* s7 P: u. Inamespoc_e Core;" w, |3 h" Q3 x7 O
include '05ou.php';- Z+ W( v* a2 W9 I
functio_n showinfo(){
4 Z, E, w9 a6 c9 r2 p    echo __METHOD__,'<br/>';
; D* A9 c( `( F; t: D3 x) O7 z  l}1 k" `9 Y! z& j/ c4 Z

3 I7 y4 H+ u$ [6 b" e7 Hnew \Controller\AdminController;
- }2 q1 r* }8 }----------------------------------------------------------------------------+ w7 N* t* N, w8 b
05ou.php
5 W, t% P$ O, v' w: Z: c3 a  d<php
7 w3 _5 f' U8 r/ fnamespoc_e Controller;
% N4 o$ S& t: L& y! C8 I6 h2 ~9 L8 g
clas_s AdminController{% I8 \/ J7 r/ ^+ s
        public functio_n __construct(){
4 q6 T7 i+ F* ]1 |                echo __METHOD__,'<br/>';
5 O2 L0 |8 X) C6 T: S    }
/ v* k! F/ F. L( G7 c}1 A6 n) \% d! B6 C
----------------------------------------------------------------------------# S: ^9 r/ X3 L, S( \
9 Q7 j2 y& T3 @- y; b$ }" c5 j
4.引入空间成员:) R# A/ Z: ?7 a) D

( Z# L" R, u) Y, N  q! E9 v1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
" t! y0 d* X$ P$ N$ y/ U& Y6 y
% `' V. y; v5 F9 }& [$ s* G2 u% V. [----------------------------------------------------------------------------
$ E. F1 d, H, b/ M+ Q$ r- D5 K6 A+ l8 G
04inc.php
; u3 P! Q+ i; A8 M! U" g<php1 t. D5 o9 ^  N. a1 d8 a4 I# k
namespoc_e Core;
2 H7 j: }8 B$ k% W, V3 u1 Muse Admin\Controller as con;
4 T4 U0 }2 E/ o9 T0 x- V1 |8 K. }* s# o( k7 B
include '05ou.php';6 O, ^! T7 z! t: M% H+ C3 Z
5 i4 G/ w0 x/ a! {- d! I4 R4 {: }8 m
new con\AdminController();( s( f. e9 [8 ?2 \: K& w
----------------------------------------------------------------------------
5 H1 B  `! C/ i' M- j. ?, y05ou.php! d. C8 F5 |0 w- O8 y
<php9 z& q8 {& F; c( N
namespoc_e Admin\Controller;- `8 n  _1 K/ G& c. ?% U: N* s7 r. Q
3 s5 h7 f- D. Y) n/ A5 ~
clas_s AdminController{" m& L* Z# R' }1 e7 {
    public functio_n __construct(){5 N! z! A8 s9 M; `9 S
        echo __METHOD__,'<br/>';  Z' {4 a( `/ A4 E$ h" c7 |% o8 h
    }: h5 i% [% ^* r* Q
}
" ]% C4 Q" }( k. \----------------------------------------------------------------------------7 ?. I! t  t3 [2 F7 B
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。! M! Y! w( }5 g7 ]
% y' F: n6 y5 C* Q( h" K1 h; j: u7 N
----------------------------------------------------------------------------
' f& l$ F" `* Z0 v" l2 S; S3 R; k/ _: B$ s+ `5 S( k9 ~
04inc.php
2 A6 l) X0 z0 V<php
; [, [4 S4 F( G6 B) j//引入空间成员类
) v% I# K" u) K' E5 a  O: a. ^6 g+ s" n3 S- y) I1 ?" g" c3 c: q9 G* w4 n
namespoc_e Core;
# N4 h. [% ~; v7 }& k9 j$ Suse Admin\Controller\AdminController;) Z+ p( \( Q* g; x7 I  X
include '05ou.php';! v: }: C5 f+ M

. q/ c5 H  P3 @: nnew AdminController();! `$ y& Z' v/ `9 u. V( |$ O
----------------------------------------------------------------------------8 }+ h7 s2 E$ j6 Z5 V! ]
05ou.php
5 ]8 y1 c8 M7 k2 m<php( T4 X1 `6 y9 B& ?  }% b2 C
namespoc_e Admin\Controller;: |& E- Y" p) |9 [0 q6 [

! v% y. T" `* |4 |8 Oclas_s AdminController{" L! f9 }! ?9 t; S
    public functio_n __construct(){
# z4 D8 a6 S/ ~+ D  a        echo __METHOD__,'<br/>';
( U# n" g# y# n+ E6 N    }
" \3 k" f1 k' f/ O. `}4 M: b8 e5 Z* ?7 L
----------------------------------------------------------------------------$ M* V7 \" K9 p" l+ u) A
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。4 Q' O* L  W# Z8 J  Q
. W# `  t, M7 n9 M2 [& u
2 Q# V1 b7 D9 U& p9 R0 W3 N
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
; p9 r6 S4 K  g: r9 q2 m3 h$ s* d4 ?- ~: f

* e; Q$ i! G5 i5 ]# J) H/ ?! e2 ~6 @
: K- j# X( K1 T# E" g  V& p) e5 m) z- w9 Z. y
2 c) G2 h: V. D! s7 U% B6 T2 M

* y. y9 }! s/ A( h2 s9 B+ h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 21:51 , Processed in 0.153238 second(s), 24 queries .

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