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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:& n: }" c+ i  E5 x

9 n6 ~: l" w  D* o( @在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
! a$ d- `' C+ X! T! t+ Y; T, h2 f8 o. r+ J! l8 [- ]5 ]- T

' D' e% R3 q: N; K- C5 X- |: F, H4 }, f% [1 e9 Y8 J) Z1 R2 Q
我们来详细的讲解一下PHP中的命名空间:* d0 b5 a" e5 i( \. p
" J/ y: |+ Q/ P* B6 d
语法:namespac_e 空间名\空间名;
/ V3 x6 t& ^' N( A& {4 n( \% k. u% n4 E: y
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
7 F: p* n4 k9 O" o9 o4 Z- ~: _1 {: _1 N8 y1 \
----------------------------------------------------------------------------% P) K: S" {: p- g  n1 n7 `
) {# B! I' v: `0 ~; E( S( J
<php
# e; C) ^; e2 z) I9 [; d' k" F1 A. _( r2 W
namespoc_e AA;& L: a- @2 k, R
functio_n showInfo(){1 m; u$ Z; x8 \, r  Q
    echo __METHOD__,'<br/>';
, }) P1 c" ?5 I}5 C6 }. _& I3 C( j7 B
showinfo();2 n1 \& u# _. _% i0 Q) v2 ?

0 ^" J, M2 U+ @7 onamespoc_e AA\BB;! C" [$ A6 s/ I. [& ]+ K- B

/ h- A7 q+ q$ P0 ^# C; jfunctio_n showInfo(){
8 M, e: i& v* D    echo __METHOD__,'<br/>';
+ q. N9 T" i- _0 @}
  P; h/ B- J) F, Z9 Z//showInfo();
, j! @' b; ~, A) v3 d+ S# i----------------------------------------------------------------------------
% R' b. V" g4 d+ \2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const), E" B9 y0 z: y( R9 R* f) C

% Q4 ?" I& O5 O, z6 p3 N3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。$ M# p, ^- C8 H5 F1 s. l. h

" J; _& \- T( ?1 d2 o----------------------------------------------------------------------------! l* ~" d0 Z, X) b) W
: j+ B- ~5 P4 r' K- K
<php
3 M9 b; y* f" o) w9 g, H/ }9 qnamespoc_e AA\BB;
' e7 f9 b" ]( mfunctio_n showInfo(){
3 D7 l$ t2 G5 ^" w1 c8 ~; K  D8 H8 M    echo __METHOD__,'<br/>';
4 O+ y, Z) u/ a}
6 S$ v1 v7 w; P! M8 U+ y. _namespoc_e CC;
! G" o) ?; {5 Tfunctio_n showInfo(){
, ]4 _+ R% b3 G) t' {3 o5 U    echo __METHOD__,'<br/>';- p. y, n7 z# J
}8 m& U  O+ N" H' E
namespoc_e AA;6 O- Y5 m8 f4 E. _( H6 D
functio_n showInfo(){' F  h& H5 i0 |- Q* S0 B( s5 k
    echo __METHOD__,'<br/>';
7 x: w! u3 o  ]* C7 s9 T3 u1 b) H}! q; }! }5 r4 \: M4 u* i
//非限定访问:用于访问当前空间中的成员8 _% E. a0 I$ K( k. n' w3 f
showInfo();
3 R6 d2 i7 \' e# `//限定访问:只能访问当前所在的空间的子空间中的成员4 x" L* R! y; Z
BB\showInfo();# N3 T5 z7 e' m6 S8 z8 o
//完全限定:可以访问其它所有的空间的成员! s; ^7 L& M3 N" h  t
\CC\showInfo();
) Y$ @# O) L1 Q4 e% e7 b↑根空间标识符3 \) D' e. b: A* e: b
----------------------------------------------------------------------------
) A9 }% w) H( V; K/ j但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
. n/ v, Q! j4 ~2 V
' g. ^4 r8 a8 k" Q% s5 b0 J( p当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ [4 v6 B( ~1 @' x0 O  d
$ c( O, m5 M1 q& N. X
代码示例如下:
- `0 N# m5 r4 P3 ^( O( X0 }! P% c) ]
----------------------------------------------------------------------------
; k# K3 \, ]6 s) x' N( W
4 U: c5 [# Y& Z5 {* D) k/ M7 h% o; ^8 M) L& r* d  e
04inc.php  x' l# y# d) ]
<php
; C* e" v9 C9 ?0 u* U# {4 q# p
9 B% Z5 v) x7 r' dnamespoc_e Core;
2 _# b2 R' V5 ^include '05ou.php';
0 Z$ m1 N8 G1 @- ~- `6 M( u* znew \AdminController();; H: r0 |1 Z9 X( `% n
showInfo();
5 _4 C0 Q6 C+ N& ~
4 h' }) F3 n: d6 Y+ ~$ t' c% R' Uecho P;
" q, [: w; V0 K% m" N" L9 I# p% D//根空间中的成员,只要类的访问必须加‘/’: a6 r- r. L7 h3 W1 P  b$ j8 r
----------------------------------------------------------------------------
! S) D8 o( `6 Y' r, t, W9 I, F
& m  B$ ]# x8 j9 ]& T05ou.php
) p$ F( F* s6 r+ b  e<php
& i0 Q3 j+ y) C& E5 P& v" l/ sconst P=5;
& X2 p6 c  c% r! ?( q- F- `. R; M% O& F4 s" _6 O
functio_n showinfo(){
$ q( m6 ?7 K9 `    echo __METHOD__,'<br/>';$ y" a6 L* E' n1 A9 p
}
( b' w7 F  h6 z- a! X- h5 y# r# `+ M1 H
clas_s AdminController{
+ E- |* c' Q& l: ]4 n    public functio_n __construct(){* @* s! Y1 i5 ?. S, p+ e
        echo __METHOD__,'<br/>';$ U: F# z/ B4 V, G1 g! `) u
    }0 \- n- K1 E& S. A
}
, R  o/ d: A4 b/ p
- N* L( P8 m# C第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 t0 b7 Z3 x! l
----------------------------------------------------------------------------
  k. t( x/ w- O. @6 b! t04inc.php
1 W% |7 C  {; C  L+ t; d# e<php7 d* `* Y, x, ?) l1 }5 h

/ ]! B1 v% f, x% tnamespoc_e Core;. J/ Q) s& ?% t6 p8 [- X6 f
include '05ou.php';# \; s3 U) z" ~
functio_n showinfo(){- c( _5 t9 o7 d+ @9 O/ U  p8 C
    echo __METHOD__,'<br/>';
! @3 i  ~2 s9 h# R}
1 ^" w  w! ?6 X8 z& w4 C. k! j% v' Q. t
5 Y& Z. K: r. n! b' ~: W% Nnew \Controller\AdminController;
2 P0 g" l+ V' I. Q+ w+ b" ?----------------------------------------------------------------------------- L' `2 c: P$ M
05ou.php4 q1 f$ w) y2 u* S& I8 \
<php
3 W: G* V& v5 x/ i( unamespoc_e Controller;
/ n6 M" t* J9 N$ B, M  t$ C/ w& @3 d) V: n7 A2 v6 n6 L7 z4 F9 [
clas_s AdminController{
7 m$ P" x2 f; t' L, J1 F        public functio_n __construct(){6 E4 S6 p! t  ?+ d
                echo __METHOD__,'<br/>';
3 j; N' X6 m. b" t9 K    }2 f! L7 }3 ~1 T
}+ |5 Q* v6 N4 Q& W6 _4 j
----------------------------------------------------------------------------
, P" i* D9 a! J. G* u, R" k- K( `  D! |2 B
4.引入空间成员:* D: c+ V" `. x& F: f
& r8 p) i* L, |+ }# ]5 j* r
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( z2 f" G. t( K& I' T. \; F

- M8 L9 t! k/ ]8 a1 _, e----------------------------------------------------------------------------+ r4 `$ ?* w% _& H  V4 ?' |- ~

9 p; K* Z4 u* R1 V  i/ b04inc.php
. m9 b  N, J# G; c<php
4 {! W# ?+ t) a, l6 @: Inamespoc_e Core;
: C3 S. W" v/ D8 `use Admin\Controller as con;3 d1 u# z, g" r5 H% p
7 ^! t, w. M" T0 v/ Q' {4 ~% p# E
include '05ou.php';
; V/ b9 A- i& J# g- R2 C# O
7 Y) |! k( U$ z, e! inew con\AdminController();
4 U( F. m# b9 X- V' F! Q. `----------------------------------------------------------------------------
/ V( |% D' X. l05ou.php1 H  k" H9 e6 R' _3 K% K
<php3 ^8 W* d% Y; {+ R" X) g
namespoc_e Admin\Controller;
- J5 ~3 V8 J8 D: t+ f& c/ F! q1 a$ R2 ?+ _0 Z# V" s
clas_s AdminController{: M8 `$ A- z" |% l4 S) l! }% `
    public functio_n __construct(){0 p  H8 ]" F0 j: v/ V
        echo __METHOD__,'<br/>';* N: K: h- I# R/ z' Z$ B* c9 I  y$ c
    }
' X% C! {4 a4 Z5 m* i}. m3 O4 ?8 W: n- k% H
----------------------------------------------------------------------------$ P& k1 z9 w  P' S: @( w) ~+ Z( \
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
( ?$ w. [1 i% t1 K9 p9 b& |" S, G" W* t4 Y. r
----------------------------------------------------------------------------
# V  u: B+ g( K1 x- t; S8 {. r  o) G3 B6 n) l# e7 r7 ^
04inc.php4 c) m5 q& l8 s+ ?4 c
<php
5 Z# {3 E" z1 ?0 b) _5 R//引入空间成员类
) o* T4 E5 R4 s  F! Y# C# v1 h2 t+ n& J8 T# p' u
namespoc_e Core;# H' ]) J6 N$ q3 X
use Admin\Controller\AdminController;; p' Y# @1 f& G2 p0 K4 B
include '05ou.php';
: _! `6 a4 T- A3 @, x/ Y( M) I- n& [/ G
new AdminController();
* ^1 }: Y( y+ f  ?: J----------------------------------------------------------------------------* r) A( a2 t* O5 {3 i: O
05ou.php8 a) j: h$ d+ l0 _# ?  Y) l
<php
5 S5 y& k- V3 \- Unamespoc_e Admin\Controller;: }' i4 j; G5 w
2 c" E+ ?  f. ^0 R; v1 W) U
clas_s AdminController{; C  l. i) Q5 [, P
    public functio_n __construct(){  D- z, o9 B, _3 t
        echo __METHOD__,'<br/>';# G+ K$ x/ h. G7 x- Q9 V6 c& F
    }- @( x# w( ]! n) a
}+ @2 \. Q( {& d. }$ w* k
----------------------------------------------------------------------------) j) u' W, A8 j3 O7 ?: E; E4 ?4 u
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
. }/ ^8 n+ i* I) F$ U% C* U
8 h% f* y5 f& v/ A2 h& ^+ b; W
- O' r$ R0 N% \3 c1 Z9 ^% a这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。( s0 H/ C* v. y+ l  R5 B

* |3 C/ B& M6 O- e7 g8 x. M! w; k  u' W0 y' m/ d& @4 j; _4 f

( }6 s4 U- h8 i$ L3 q  D8 |! G0 M( ~/ U" C* ?2 _  c3 m
. E3 W7 g6 `0 i& L" G0 ~

) B8 k! ~7 M( y9 o) d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 21:07 , Processed in 0.071042 second(s), 22 queries .

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