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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 91| 评论数: 0|帖子模式

1.命名空间的作用:2 h/ }( f: v0 Y

; k" d9 Z  h" q' O在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:* F0 z0 q/ b$ L7 j
0 L& c0 ?$ b% X  g% V5 S1 l
20181201105307520[3].png 5 Y/ D& M: x$ l( A5 _
( t/ T. D" p; x) Y! K- |% m
我们来详细的讲解一下PHP中的命名空间:
: p3 r# B1 N+ O! c: M
* g; W, I) ?2 {6 `) F& P' Y2 f2 f语法:namespac_e 空间名\空间名;2 \- q" ]2 I0 }/ \: w, h. Y% q/ x4 p
$ y! J( `; a# \5 c; u7 P$ B
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:6 w" F# B/ P( M

  J5 F  g" Q( ^) `1 l5 J" c0 Z/ E----------------------------------------------------------------------------
- m  i; G# s3 Q  O, d- Q0 q4 q. t0 L3 s
<php
3 s; v& r) P$ b! Y
) a# r% c% T' D# J' |7 Knamespoc_e AA;- a- V# P% N. Y0 C0 k; }  U+ y
functio_n showInfo(){2 h2 H, j" k2 J: S) C
    echo __METHOD__,'<br/>';
; v# h& K9 D7 D$ O+ F) E+ B}& f$ U" m+ `5 b
showinfo();
* h2 K1 }+ v- b, l, P7 [3 e& V. E; d! I  F8 h; X
namespoc_e AA\BB;- Y' v, q3 U* o& r6 x: }
( t  c$ q  u6 n! [& g
functio_n showInfo(){
% b/ @5 J, S$ J  S    echo __METHOD__,'<br/>';: l# u. L0 @8 d6 S! Z
}
; U5 n( a; E$ [//showInfo();  y1 j9 C  J: T
----------------------------------------------------------------------------
7 o' A+ M$ N% y7 `3 |: f8 C2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)/ Z3 ~# N( _" X+ J
  L7 u& R' N+ E& T; p9 i/ W. {
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。$ J7 P% l: e: R1 p' Y
' Z, a! r+ P  K# m* X0 g4 _
----------------------------------------------------------------------------& E& J( |7 ?% e

# p5 i" M, [4 Z# e5 A; {- X& e<php
: I! l  c$ S5 U" d/ ?namespoc_e AA\BB;8 V, Q9 v' X$ x# S- X! n
functio_n showInfo(){+ _0 q# }( }$ t+ ]) g" t; O: n+ S
    echo __METHOD__,'<br/>';
) `' @' H4 b1 p, ~& F6 n7 U}* p' m- d& _3 H/ v4 n
namespoc_e CC;; B9 V; z# o! ~9 P; ^6 ~
functio_n showInfo(){
& Y6 B& m4 @2 Q5 [    echo __METHOD__,'<br/>';
* f) @/ V* J* j}
1 q4 {( A5 k7 D/ Znamespoc_e AA;
. u/ G! P/ E3 F. Sfunctio_n showInfo(){7 n1 B: A5 v( e1 K6 r5 G
    echo __METHOD__,'<br/>';. H" R0 R( |( ~' W3 l' R, g
}
) L: R! Z9 v' J, ]- p$ ?8 X& G//非限定访问:用于访问当前空间中的成员
, B, n2 L$ ?; S3 d! O& FshowInfo();
' Q, s$ |$ q' a  g//限定访问:只能访问当前所在的空间的子空间中的成员3 w+ G3 \7 B9 C: m6 O
BB\showInfo();
) ~* S7 m- Z. p' c  y//完全限定:可以访问其它所有的空间的成员# @0 l- G7 I, Q# A, Y
\CC\showInfo();; A' k% V# u7 l7 Z, i
↑根空间标识符
. z0 ^8 v' F0 x7 @----------------------------------------------------------------------------
  T) m/ P3 R' u但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:3 ^4 X4 j0 R9 F3 ^; h
/ J; q1 n% N0 q4 X5 y1 m
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间), I  m1 d4 |' C8 A& Q: Z$ k

, u8 W  M% [6 {6 i代码示例如下:
4 W* @$ o; V' T# S+ Y" ?# L- V5 Z  z: E7 l. O
----------------------------------------------------------------------------
/ R' Y  s9 q! c7 L" u/ Z( `! f. p: Q) x  j& u8 }2 j% ~9 f2 l3 W
1 K0 }- H" Y% q3 I9 B) V
04inc.php; y) c# X; Y, i  b' F2 h
<php7 m8 F1 x) ^0 ]0 v" L- H
  F1 }1 p+ v$ R1 g5 X9 _
namespoc_e Core;
1 M1 E5 L  [) ]+ ginclude '05ou.php';7 C1 v2 f# [) @6 x
new \AdminController();
! H- m9 l' N6 X- r1 i+ e  N: SshowInfo();
, `) i4 N: x. b& P0 N, a4 n. ~9 @% j% f2 Z: B4 b
echo P;. m  X' f! O8 ^7 d. E1 y
//根空间中的成员,只要类的访问必须加‘/’  _" [! A! I; H1 z4 X2 V  `
----------------------------------------------------------------------------# q4 Y2 h+ f/ m9 I- ~6 [

6 l1 f2 u% U# K0 t7 o05ou.php
# B3 E" o4 r$ a1 G1 y3 R<php
( n2 J$ \6 m2 \const P=5;
( w6 V2 H/ A% e
* }: J$ u/ v9 c' Kfunctio_n showinfo(){# m3 X& f, t" |2 E: j3 r
    echo __METHOD__,'<br/>';
* P+ I! G9 \5 ~8 w! E}0 e" W9 ~: W) G

0 k" C4 X; u1 m. Q) \, Cclas_s AdminController{
5 g+ _. T( o5 M& i    public functio_n __construct(){1 A$ ?) C8 X8 t- m# d4 o3 N% O" O) I1 z
        echo __METHOD__,'<br/>';
" |6 {7 \. h6 G% L% w  u' m- H4 h    }
: V" w* ?, _( {, N# G2 U; z1 @}
5 Z7 x! b1 q! r0 K: w" J2 J/ C0 \3 s8 A5 c
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ v. i/ X9 y. ]/ l" v0 R
----------------------------------------------------------------------------
- w8 v$ ~) T) ]" E5 m! Y04inc.php
, _# z* Y7 R5 K0 _- f, @<php
2 Y7 ~$ c7 m3 f7 X+ x) j% d' c1 Y! y$ `! W" q4 a5 K
namespoc_e Core;: k! y6 X+ G  M
include '05ou.php';( L: F+ K0 c! ~) A: H
functio_n showinfo(){6 {  a, f. g( c1 ~% q
    echo __METHOD__,'<br/>';
, V: x; p2 C/ o- g}
: z5 d& W. O7 f% T/ V& X7 ^6 w3 @; r) H* j
new \Controller\AdminController;# f* o8 L7 Q7 E; Z2 ]
----------------------------------------------------------------------------* u) }: S& C/ X( V3 ^( ^
05ou.php
3 F1 }6 k& p# G<php
/ ?& U2 V0 _0 pnamespoc_e Controller;) N# q0 B1 `5 @) p( I; M0 j
. J" o2 ^5 u, o  G, D3 v8 t
clas_s AdminController{
2 B4 t' ?8 i: D! [) |        public functio_n __construct(){
( _) k( ]( x& t# g                echo __METHOD__,'<br/>';  P7 e/ H) b& f) ?' }
    }* v7 U# z$ V" s0 w
}
6 ~5 o1 i9 u* [----------------------------------------------------------------------------) L( L3 `9 `' V# q
* c$ \- f+ T/ p; N" a
4.引入空间成员:
0 v/ G; E$ I" F  d8 L: i: \
6 B5 R4 f7 p2 c1 r, A1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
: |& S/ x% ]! j) n
; a: t1 X0 K* I1 G8 z7 i6 H: k----------------------------------------------------------------------------4 U% c- P6 `' j, c. J( m6 H( N

2 S/ E8 y  F* s; u/ z4 L  E) F04inc.php9 [8 V0 W3 p- O; L) [
<php
9 `; {! i# I5 o8 jnamespoc_e Core;
  K, a" ^; p. nuse Admin\Controller as con;2 g% t" ]) v7 W2 I+ g- f
' [5 {) h& U& Y- n; w
include '05ou.php';  ~: ]! o& k+ G6 |
* E5 S4 z4 i. X: c& U
new con\AdminController();
: R0 B3 Y, [0 `  ~8 o) {----------------------------------------------------------------------------$ U5 e6 K5 G" t- v6 v0 W- l3 D5 [9 z
05ou.php! ]3 v" P6 P' n' H# D
<php
) I3 a: j/ F8 [$ |, s+ a0 n! _( q- y% Tnamespoc_e Admin\Controller;! o2 W- Q4 `+ v$ T" l: I
& ~9 ]2 e1 p' ^6 h: d
clas_s AdminController{
# p! q6 A1 N. z; W: L" P2 A+ j    public functio_n __construct(){
2 v$ U# G9 D9 y. W0 Z* g        echo __METHOD__,'<br/>';
. R/ N0 }8 o# f    }
6 q2 x$ C! I3 M/ B0 n2 w}
6 D* R$ U  \# B----------------------------------------------------------------------------- w! G9 q% i% G% U
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
' F( a1 K* O/ l5 a$ A) b- ~3 F; a0 Q7 i) o0 T* K
----------------------------------------------------------------------------( y4 B9 ?2 ]9 r2 V

5 R" u1 l# O6 F  ?6 A04inc.php2 U# ^! P$ T2 s0 P% |( ^/ A4 E# A
<php
4 I. Y& p/ @0 p0 v; f4 ^//引入空间成员类
) ^5 D- z; b. U, M" f0 j% _5 w5 [( r, l; n* h. T# P
namespoc_e Core;  |3 I( T6 Y% q- B
use Admin\Controller\AdminController;
- z) D) p# h: S. Ginclude '05ou.php';9 u2 y! a- t$ W7 Z# ]# M
* T$ R1 E7 {, R, D0 B  P. Z" r; K- R
new AdminController();1 i9 M+ i! \0 t/ y# I
----------------------------------------------------------------------------
- Z! j: [; {+ D& Z8 E05ou.php$ {) U, n/ E% L4 T$ N5 r3 y
<php  Z, f) d/ Z- I" r
namespoc_e Admin\Controller;
" h0 ^" ]3 n$ O* q- l' e4 P! X
' ~! _$ O2 |) j* k9 Sclas_s AdminController{* r5 X5 P' K! s* a+ K1 F
    public functio_n __construct(){
8 q6 G7 G; }) y1 u( P5 C) Q$ F        echo __METHOD__,'<br/>';
6 c  @8 m" q4 x% r' K    }) u% n- a% K8 p+ {1 L
}
6 ~* A5 M  m$ {6 D----------------------------------------------------------------------------2 Z  i6 `% b5 i
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
% K- ?( ^0 ^0 K- @: B; `  x9 _/ z% @! r, I8 n" @$ v
3 ~+ ~  l5 ^; S
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。9 O6 m# V$ d+ |9 O9 Y; ?
* Y7 G9 D6 o4 U% `
+ `# b5 ~% F! C+ V8 u
0 F7 z8 Z" s( t/ O4 s% x
& G0 ~: \/ }' o2 S0 o. i8 E- U

. ~3 [, f+ y+ M* M: z7 D8 D% S
. [$ |4 C' k" S. _& g; S

最新评论

        在线客服系统
    申请友链|小黑屋|手机版|Archiver| 备案信息代码:冀ICP备18019919号-1

GMT+8, 2020-8-10 12:38 , Processed in 0.149211 second(s), 25 queries .

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