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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:) Y5 ]+ m+ P1 t9 m! K. Q

' }/ `- y6 S/ \+ n  d在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
$ l# m, Q9 ^; {: K( b- J8 N- s5 L8 \8 M5 G  ^9 w8 N

& z9 W) c# k1 w( }4 Q6 ^  V- T' `; v% j# v+ u+ ?( c
我们来详细的讲解一下PHP中的命名空间:
& t! L1 k3 o) p! U4 [: \1 R
" P" X, q2 T6 _$ }" d语法:namespac_e 空间名\空间名;
4 ^! Q4 C$ `- {, }# d, w' d2 H
$ Y% i  \) k+ s3 f8 `7 Y; W' E说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 z- Z: B: q8 n2 h; b" C. e0 ~; ^% H) J2 Q/ p2 t" o
----------------------------------------------------------------------------
. Q: S: w$ j8 M/ M
# j! s+ V% x  L: P/ ?' ~/ T<php
0 }0 J6 w/ \6 a
4 [+ W0 g3 ?* [3 bnamespoc_e AA;- i( @! k* o' I- g) X
functio_n showInfo(){
' U% e+ e( k8 i8 g) l+ Q+ O    echo __METHOD__,'<br/>';) r7 W1 l. ?1 O! `
}
* @9 M% s  i2 c+ Q% Bshowinfo();
4 a6 M/ Z: [2 \- N2 g+ l% I
+ b' r! z9 M2 j% anamespoc_e AA\BB;
. a$ _" M- H% `1 _8 V( m0 X3 h  j& e4 W' D- C
functio_n showInfo(){$ M" u9 r7 q( [
    echo __METHOD__,'<br/>';
. M) d" h. _/ U}
$ f$ O$ q- q$ L' V//showInfo();
4 p. \4 B6 u8 w9 g3 t0 S( _----------------------------------------------------------------------------
' L  o/ ]1 u5 W) C2 i2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)5 y; g. j' p+ S+ V5 `' ]

! W$ a: R0 P, v* A6 q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
% P8 S- y6 Y. X& f* c5 p; [9 R9 O6 l- Y& O
----------------------------------------------------------------------------
( _5 R  }6 R4 ]  o; m  {* P
$ E# \) d" R8 c2 l8 s( a<php
/ ^4 L+ d/ W* a6 |namespoc_e AA\BB;9 {) C2 z6 C! `6 K5 ?
functio_n showInfo(){( O# L6 M6 c* |- y8 P. j
    echo __METHOD__,'<br/>';
8 y* [+ P% e5 ^& G}+ f+ x# C0 \+ [* g$ x9 I5 k  @9 S
namespoc_e CC;( Y5 w0 ?# P4 \# J% h
functio_n showInfo(){
2 E, [; N+ f( ~) u! v5 X9 d1 n    echo __METHOD__,'<br/>';
3 a" @0 k' {3 j8 ]; W}
. g* u2 h" Z; F' vnamespoc_e AA;
: N' ^; G$ ?' e8 f* q! R6 ]: afunctio_n showInfo(){3 X) F1 w# U3 ~& J! `0 ]
    echo __METHOD__,'<br/>';
0 `+ I' B, x0 ?- p7 }( R}- U9 T  E' \. }( c4 ]; O
//非限定访问:用于访问当前空间中的成员  J8 F6 A+ h% P* W0 V0 ]( Q( M
showInfo();# U$ z3 z: b6 E( W. N6 U
//限定访问:只能访问当前所在的空间的子空间中的成员( y! F4 Z3 O/ A
BB\showInfo();
0 z- I6 n* ]/ s//完全限定:可以访问其它所有的空间的成员& E; w/ m; w7 B
\CC\showInfo();2 w9 e; l+ q; Y& x( c" v
↑根空间标识符
! F* G* h  l. }9 d----------------------------------------------------------------------------
+ \; }* Q, @* g1 i但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
/ S$ p3 Z* E+ ^: I! L9 j* ?; c3 n/ C% g. L
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)0 ~# [# {! M4 q8 y: E

3 X$ }! s0 o3 i) N代码示例如下:
% H1 g7 O: S! p: T" t
3 A9 X5 Q+ M3 P----------------------------------------------------------------------------8 n! \& Z& P. p' I; J
" s8 H3 S7 e* H1 t" ?6 k; Y, G
8 ~, }# m! V5 r5 _
04inc.php
/ H2 u- O$ u/ w) ^<php( v4 j; k; e- }+ f
7 O( I# ~& T! \! r1 h
namespoc_e Core;
% O- J! M( _* U# O$ {' |# q: i  finclude '05ou.php';
4 N: Z' u/ R* A( K5 a9 Rnew \AdminController();& P$ L! ~+ X  y; u) W- t# ^. ]. M6 m
showInfo();
9 c- O4 X2 p1 N& n4 }$ x# c1 o/ a4 Z2 V5 p
echo P;
. e5 j7 t8 m+ B. g//根空间中的成员,只要类的访问必须加‘/’; @' d% K3 w+ N  R: j& t* W
----------------------------------------------------------------------------
7 H1 C- h; T8 q+ L8 n
. B- U+ p3 E" \# h& L05ou.php/ U" G. S0 B- o* W9 v( K' r1 K
<php( m$ g7 ~( y. w9 E5 b( _$ D5 y
const P=5;
* P( @- `  C6 H) _* F% x3 @8 }- `: J9 }. k
functio_n showinfo(){
$ w' j% u0 I8 \    echo __METHOD__,'<br/>';
9 E- B5 u9 x. D, U( B2 n2 {}
( |6 O/ G+ e8 Q- f& j6 H( y! e
clas_s AdminController{* |# e: b0 _3 ~
    public functio_n __construct(){
' S1 ]$ n+ Y. T% ]2 F# h# O- x) Y        echo __METHOD__,'<br/>';
0 o' b# i. k% b, R3 @$ A2 d+ Q    }
( g4 I8 Q3 k8 C- n; ~4 b( k}
$ s& X* |3 I* E; r+ N% V- ^
4 h. o0 ]* f: s6 f2 }( h# d/ e. u9 o第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! c! b+ t. P# h# z
----------------------------------------------------------------------------) i/ ]- Z6 [. @
04inc.php% G  q! E- ]: D3 j
<php
7 e7 z2 Y) Y/ Q
& f2 ]4 M, x" O4 t4 Dnamespoc_e Core;
  @: Z( S* b2 |8 Oinclude '05ou.php';$ ~2 f9 s' ~$ A0 I+ t
functio_n showinfo(){
" l. K; h  O3 ?/ s: c    echo __METHOD__,'<br/>';# I8 t3 t% n( I$ `/ {
}, Y  w, @, k9 _' F
; R1 J) [% o! H
new \Controller\AdminController;6 H  y1 K0 S  [! i
----------------------------------------------------------------------------0 o+ }& i* k+ U0 Q5 `5 k
05ou.php
3 E9 X3 S4 t# Y<php
5 [# s2 J9 Y( O6 `namespoc_e Controller;
9 W. _# n# N' N9 s8 k2 b7 y( }$ J1 X. R" @
clas_s AdminController{
# T, |0 ]0 ], q% m        public functio_n __construct(){
. q# a; A: F+ B4 A; D                echo __METHOD__,'<br/>';3 N' J& x0 F9 Y" _9 K
    }5 t, Q; E. k% F; K
}+ ~$ z6 a5 N# P9 M* c( F
----------------------------------------------------------------------------1 r* z- G1 Y' v

8 H( _: P% l: d: b1 @7 ]4.引入空间成员:% Q1 s! `. S6 `9 K, B

/ Q8 m$ ?" g  o* W1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。# H; d5 w1 V( d4 R

& H' @! S( z- w2 Q, o8 W----------------------------------------------------------------------------
4 o/ e0 Y* w, R# Q( z6 h, y1 T# Y% k* y$ k! f
04inc.php
0 H- t2 _0 T: y5 v0 _. Q3 j' K<php
6 ^: X6 c: e0 H' _" Z) N' Bnamespoc_e Core;
; h; t4 M+ \, M; q# @use Admin\Controller as con;
& m/ \% q; @) Q5 l- d
# ?" x8 P9 f  \( X5 J2 E, |include '05ou.php';5 [/ U# `- C; f3 K6 V. k6 ?
) ~* C& |: ^/ u  f8 ?: z7 a
new con\AdminController();6 `/ R" z( x) R5 s
----------------------------------------------------------------------------
& B' @& X: U% S6 e+ ^9 R05ou.php
2 \4 l" Y. L* R. ]! \4 ^<php* Z8 Q, ~, b1 @$ m, t7 s
namespoc_e Admin\Controller;
/ j4 J& t( c4 s" T/ k9 I6 K" g% e4 j, s6 U8 R& x; z. a
clas_s AdminController{  I- M# l6 W  t, Q
    public functio_n __construct(){
, _( _7 \, U  N. g0 X) ~        echo __METHOD__,'<br/>';- f: `/ r. {# ~$ `; m. |
    }% h3 A" p; j  Q
}# y7 a8 z; O7 z+ r
----------------------------------------------------------------------------
& ^  d4 D3 N" D3 z. I  U/ H2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。5 [& t6 v4 F) F1 ~
$ y" D% s9 w  n" X. ~! J  f( N, f  F/ t
----------------------------------------------------------------------------/ a9 i7 D0 h3 H& G8 B3 ]5 W6 e
  }: q. G5 w7 a! d5 }8 G
04inc.php! D( g& l3 s6 y* P7 S  p
<php& G$ ?# }* }% n$ P1 o3 b
//引入空间成员类3 o) ~1 n5 s$ d; ?# X) F) e* v; D
/ |. E  n4 i! l- U# d1 r
namespoc_e Core;
- Z/ a4 g! v6 o# E. suse Admin\Controller\AdminController;: Z$ C6 h8 L6 r$ t7 X
include '05ou.php';- z4 |, Q, `' f8 A( o. X

$ X: _4 {" e( Z9 h8 D/ A% Unew AdminController();
3 v; b. ]+ M. G9 G' U----------------------------------------------------------------------------
7 I' ?! z+ c5 p( i, A, I3 x05ou.php
% L9 e0 S3 V8 G) `3 x/ c9 P<php
$ t) p7 O$ o! U  J6 k' Cnamespoc_e Admin\Controller;) j4 k$ q; o! v& ~3 V7 Q
! l1 U" X3 @4 u( s  d% E; Y3 ?1 c
clas_s AdminController{+ F+ @, [. X, ~4 w7 b" Z; D5 w
    public functio_n __construct(){
! y+ M( F! q8 R# Q: L        echo __METHOD__,'<br/>';
% x9 J# q) d+ l. i    }4 ^# ~5 _# d. m/ N  A/ q$ N( l  }
}
2 v1 F$ n5 |$ t- b7 f----------------------------------------------------------------------------6 W# I- A7 h$ e) D  G
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" J" ?9 b6 A% s  k
( u8 W/ ^8 b& C7 n5 b/ F* v# o% G% w) \$ Z$ G9 F
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% Q5 i; k* O4 u. a
& i& G2 c- U- ~, D4 T, p- z
$ y1 n8 R5 B; B# y
1 N- {6 M0 l8 R1 w2 M( h  U. r8 Z0 M8 |
% _( F0 W% j* [  u; F

; P+ k; y2 J: h8 @, l& F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-5 01:03 , Processed in 0.063290 second(s), 26 queries .

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