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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:- H% B% W; z# X8 `1 \1 q! j

* u! |; k- V8 S, B  G9 L在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
7 g6 C8 m5 z/ i4 s  @4 B$ S' h
+ h" L& l) Y0 p( m& a
* d. }; {2 M2 z$ A4 I
0 t  a, v, p( P" b2 _我们来详细的讲解一下PHP中的命名空间:
, W4 ~. E/ N+ S3 o9 V
; U* {5 Y* p. p) Y语法:namespac_e 空间名\空间名;
: ^: _! J7 H$ Q
7 l" K% L7 ?/ N; ~" Q说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:: Y3 S9 Y/ ]& R

# ^' k; c; x% i# p----------------------------------------------------------------------------, F& ?0 o4 Q3 ^! c2 `% b+ q

  l, ^/ x1 |  G* j0 J" o<php4 u% o% \1 x. r
* u$ G% x9 O0 [* r* V6 K
namespoc_e AA;
& ?. [# `; M% v/ a" @( o) e; zfunctio_n showInfo(){; B0 M! [0 `2 O- y4 l
    echo __METHOD__,'<br/>';
5 H# r& n4 X  h% s4 l- E6 X% n}
, [3 d9 D+ [3 bshowinfo();( E3 l% O& X1 U* f9 v4 c1 f* \
: n8 S" K4 ^0 U0 x% h' a8 J
namespoc_e AA\BB;( |$ L5 P) {* ?! F# J0 ]% d

5 C3 }+ E. Y  j$ u+ y- ofunctio_n showInfo(){
5 f  a: W% W9 K+ Q7 u7 H* ^    echo __METHOD__,'<br/>';
" K' v# n. M# X0 k1 ?}% o) R: T& T% M8 \& r" I
//showInfo();+ {( N* p& V# U3 ?! O
----------------------------------------------------------------------------% W. p, U4 m/ b' j* ?: f
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)! R! n7 U& X  f$ m" U. W: c0 h
; d9 p! B3 c8 U8 ^- B
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。2 p) `4 X3 M5 k: y6 F" D

+ t+ o6 A/ i7 L+ j  S----------------------------------------------------------------------------
) a  H, i+ }, C. e" P$ H5 ~  b7 ?; S/ b* W7 e
<php
0 V# Q3 b* \! x1 p, V) i2 vnamespoc_e AA\BB;- i" E1 h7 v) X0 Z5 D' E# ^2 N4 j
functio_n showInfo(){/ B1 ?0 N# c& P% R
    echo __METHOD__,'<br/>';% G' l+ R: @4 g
}7 W& a6 c. [' M# ], V$ c
namespoc_e CC;
$ S/ n/ a; V. s. ^/ rfunctio_n showInfo(){
5 G% o  C8 k, C; V% Y    echo __METHOD__,'<br/>';6 _7 ^/ K* j/ s: l+ t
}
+ \( o# L- g& @3 c7 \) e3 Knamespoc_e AA;# E5 U. c$ Z7 s/ J# U9 @$ a
functio_n showInfo(){
" k: W9 A6 _1 c) I4 o    echo __METHOD__,'<br/>';" [5 M. c: i- P5 j3 A
}" Z8 e: S& T* w
//非限定访问:用于访问当前空间中的成员
3 N4 r( w  L/ T0 u* m- A! yshowInfo();
2 q3 l' J9 r) m/ P1 g0 i; F//限定访问:只能访问当前所在的空间的子空间中的成员3 t/ ]0 ?, v& q
BB\showInfo();+ m/ h; e4 r6 b$ `1 I% Z
//完全限定:可以访问其它所有的空间的成员0 X. @: t; O) s; k4 `
\CC\showInfo();1 J1 r- h: {% |( ~; D0 t
↑根空间标识符2 [6 T+ P( k+ p" W
----------------------------------------------------------------------------
) f0 Q0 M2 m9 l+ l( b! {& E但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:& t) c2 N! k* D% {1 t8 t# y7 ^

1 X6 y8 C, P4 A1 v  f1 y# M2 N4 C当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)9 t: a7 v. a1 V! G! n# D: [" Q

  T0 S9 {3 o7 s代码示例如下:! d( `+ Q. W$ ?
! {9 d/ |0 d8 m7 |; y
----------------------------------------------------------------------------; ]$ `, k; t8 y

. x6 ^' t# e/ g5 L5 K1 ]: t4 b# ^- H* [5 G& p; e
04inc.php% A3 @" s" e% W4 `
<php
! A- @( u: g# {" ~$ f2 C! y' c* {; L8 [* w
namespoc_e Core;
& y5 e* H7 T( b1 T# k2 Rinclude '05ou.php';
# E- z; L% c6 N9 @$ Unew \AdminController();* @1 Y' k+ K' ]: P* n
showInfo();
1 \5 S# P- P# A% }" v
4 R$ h& L" ^- A) r3 Recho P;* \! j) J# Z! c# \5 @
//根空间中的成员,只要类的访问必须加‘/’3 i3 j, w- q+ x
----------------------------------------------------------------------------
7 S1 f' B/ x0 F- U% N$ u: w3 n& Q( b' I2 Q
05ou.php6 T) w  K- l! h- _; W
<php6 i3 _9 j2 N" j/ g2 m
const P=5;
: s" V. A0 v6 E. @/ W% U- Q
# ]2 y6 k1 W# V! w! Tfunctio_n showinfo(){
2 \# h( n8 {$ w    echo __METHOD__,'<br/>';
& ~" d( c, t) E- ^7 W8 S( T}
6 o! v8 T1 F  ~( d7 d5 G/ m- P3 J1 a' h
clas_s AdminController{5 ~) q4 W2 G) B1 y
    public functio_n __construct(){# D/ m) I# t9 Q4 d7 K
        echo __METHOD__,'<br/>';
, V) r8 E: n9 x& u" Z    }
5 ~( l' h  K9 a. _6 {, D" s}: ~3 h! e5 W' O8 U9 k8 q( }

6 P% T4 c3 S! Y) ^$ u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& r" q2 T8 i) t# C
----------------------------------------------------------------------------4 o8 a8 n% e1 I
04inc.php
+ f2 k) P, g. s4 R6 x<php
; F: h+ b# X2 d+ i+ B
: e3 h0 A5 P2 S$ rnamespoc_e Core;: _6 ]; d/ H. a, p5 k; I! Y: L# n
include '05ou.php';
: ^2 u3 v' r/ y% X5 D" \1 Ufunctio_n showinfo(){, @- k/ y# |' h! @* I$ t* H! g
    echo __METHOD__,'<br/>';
9 y& M+ M8 o6 R' W" B5 q4 G3 B}' R# J# o& y# X+ i5 S  p8 `

) U7 A$ I  A! bnew \Controller\AdminController;4 v7 ?% `  Q, n; D& f3 B
----------------------------------------------------------------------------
3 g8 k- j. L0 G7 U05ou.php
8 I" p4 ^5 J1 v+ f1 x! z<php; m) G# a' {" p+ ]* m4 J
namespoc_e Controller;0 K1 K2 h' F. F7 u0 E! A

- V$ C1 F: T: w5 ?, aclas_s AdminController{
6 F2 k3 u7 E* Y# M' T% W        public functio_n __construct(){
$ |/ B5 \- r9 R( B# p) ?; t                echo __METHOD__,'<br/>';
! w$ L! E" |$ i( c    }
. R4 Z2 i! e0 Y2 Q4 m& G/ g}
& W. u4 ^; _) `$ A----------------------------------------------------------------------------  L, A2 l  ^3 k7 H) W3 k
5 g" @. N6 D3 k% l  a4 t
4.引入空间成员:
6 k' G3 u6 j& b; h( M6 V/ D9 F0 |& `2 }+ s
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
3 z" t) |, ?1 R" a6 U) n- \( }6 o  \* ]4 J- ?$ R: ]
----------------------------------------------------------------------------9 d8 X5 d; V/ T8 T

5 W, g+ w  X+ o1 E: p( i# l* }04inc.php
2 T) ], ^: l$ F( N. ~1 f( a<php4 R9 ?, I  G8 ~! x
namespoc_e Core;
% K* D# b1 j2 i, \  f$ v: t9 x% euse Admin\Controller as con;
& R, M$ H: O$ J' a% @: |& h1 ^+ S* w+ d, E1 ?3 t
include '05ou.php';5 U6 ]* r9 e  \1 `% ~" R

/ A1 \8 F: `; H) {5 v0 h9 k7 @. unew con\AdminController();
0 Y, U2 i8 r7 }% ~, h0 q----------------------------------------------------------------------------9 k$ R1 g: M1 @& H. [% g
05ou.php
8 q$ X3 s! R' C& _1 Z6 _9 q  g<php, P$ N/ M$ Q3 J; g- k4 M7 C
namespoc_e Admin\Controller;1 [1 l/ L: o! j( t  n: D
5 b5 j0 ^. E4 p
clas_s AdminController{
6 h6 `3 R; c% K$ b+ D/ Y    public functio_n __construct(){7 D7 _$ J' d5 M7 o2 ~6 {) v
        echo __METHOD__,'<br/>';+ l% z, ]5 h2 y# D) C
    }
7 q8 t( o7 O- O& V5 k}3 \7 d+ h& {5 v  b6 C. g$ ?
----------------------------------------------------------------------------
: ^8 r* ~% u8 a& c8 p% m2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
7 s/ T' ^/ x% d" O$ ]! @  f4 F' K7 b6 D+ O& n7 v
----------------------------------------------------------------------------
$ T7 j$ E- u/ X1 M! B* e
* x! c& T# W8 P/ X& h# A  j. g04inc.php' d( K( |: |' @2 O: [/ |9 P' K( l! G! v
<php) _8 T( d. @' v5 L% ?$ `
//引入空间成员类
/ I7 D$ r* ?! a5 m$ j7 w9 C8 L7 p* A% Y" Q) C! ~. ]5 m
namespoc_e Core;( R- Y+ P9 T0 C
use Admin\Controller\AdminController;) `4 f6 v  m. O1 u( S0 `! W3 O# l
include '05ou.php';
; [  t7 J+ m0 g: l! I5 I& K  b6 D% w, N9 M) I- E& t2 K- v& t, r
new AdminController();7 ]! L/ y2 P5 r9 E# F6 U) A
----------------------------------------------------------------------------
  t8 D+ t9 k2 q. D& G05ou.php0 Y# U; O' I. ^+ D: K
<php% ^' }# D: @# w
namespoc_e Admin\Controller;
, {3 g! J- s3 Q  I0 d+ C
6 F! A# F; U+ N: b% Q) \clas_s AdminController{
0 P; n" @% c2 _2 ]    public functio_n __construct(){
" ?# i  D& t+ _6 O        echo __METHOD__,'<br/>';1 J5 c- C5 ]( P5 ]; H
    }/ d3 ~* w( }) v6 O  R9 O
}
. j1 p* \7 R+ s& Q* T----------------------------------------------------------------------------/ k# u6 n! a. O. q. I) O
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
$ T( |. N5 r1 @5 a6 O- m# l5 F
3 d, j. O; ^1 l
2 U2 A" A5 ~! z+ R7 R& A这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。8 P- F/ W; G8 ~6 p. _
6 F3 n  Z/ u% X0 w5 p8 S0 G. z9 j: E, M
1 V( n$ ~) c, I
' @( g7 Q4 G2 }& e% T" E

2 @( [6 R: _2 Y* x
- Y* n5 v7 `  D  q) b9 v; I: V4 w7 h; W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-2-5 18:45 , Processed in 0.122411 second(s), 24 queries .

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