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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:2 W3 h5 C2 I+ p+ R9 b
# u' E/ e$ i( y- r" F$ Z
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
$ P: Z3 L. i7 ^( {! c+ m  x% w/ `" g+ t

% Y0 a" `# k( @$ H, M( q! E" B2 _% x; \. p0 B; e
我们来详细的讲解一下PHP中的命名空间:
/ k8 u4 B* c6 \$ d
' d1 d7 u7 c/ ?$ F, {2 B( M. l语法:namespac_e 空间名\空间名;3 T1 o3 C( X1 L$ O. P8 W7 r" c9 w

1 x- N' m/ @! z  }7 F! [# J: ~3 [说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
; X  x1 G7 ]- d- v. I( f. E# A$ V3 o4 i3 ?5 x- Z) E1 Y
----------------------------------------------------------------------------
! \: |3 J$ I2 N2 F7 ]
1 d- W/ \1 W- P! P6 H4 L<php
7 D/ Q% T" J/ l* c
! i3 b8 K# ~1 A) t; N$ P7 bnamespoc_e AA;- p0 V* y- G8 L. c
functio_n showInfo(){" f+ {  x/ ~) e* @/ z6 j  S3 p* X
    echo __METHOD__,'<br/>';/ _: ?; e& @6 Y$ k2 z/ N. K
}5 V+ f( j( S) R, z) y
showinfo();
/ M( h! n- U4 W! Y
7 K3 v- O9 U' t# nnamespoc_e AA\BB;
% x/ M$ L  z; Z, W: D4 {3 U7 l
( N$ z% s0 U! ofunctio_n showInfo(){
: `+ D( d& D' y/ _6 y% h    echo __METHOD__,'<br/>';  |4 `5 V% ^: j& E3 B: P# }
}% y$ A2 V8 B6 ?* f
//showInfo();: [# U$ ?3 G. S0 r: X1 L
----------------------------------------------------------------------------4 ^1 R# m  M& f) R. O
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
0 ~4 Q, b+ {- h' Y" T# Y
0 O1 g/ ]5 y" a* h# G  k6 P+ A0 j0 [3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
! }! f# m+ e* `, H4 M3 {1 F, ~+ k$ D( q1 ]* y* Q( J. k
----------------------------------------------------------------------------6 {4 k* e" b& w8 x7 T9 g' Q
5 _) S2 t1 z- a
<php' e* ^8 L3 x6 R! z2 c0 [9 {. a
namespoc_e AA\BB;
4 ]! y4 U4 C, }! kfunctio_n showInfo(){' m1 i7 w" }$ a! h9 G& `
    echo __METHOD__,'<br/>';
/ n  Y0 p, h- o( X2 E) c9 d}
: I4 S6 c4 R. q& f1 Lnamespoc_e CC;) p, G+ V. r6 {
functio_n showInfo(){
5 }1 y' }0 i; {; f* F( j' c    echo __METHOD__,'<br/>';) c0 x( q1 L( S% W
}$ g5 T2 `: @7 B) U; V
namespoc_e AA;
3 f' M  |5 D; F2 A. H( ofunctio_n showInfo(){* s" p8 x2 m/ W0 {; Q6 j8 I& V
    echo __METHOD__,'<br/>';
3 s$ c& O; v  [; O% y) }  S5 ~}' M2 Z  t7 o7 A
//非限定访问:用于访问当前空间中的成员* J* o/ g4 r! H9 z1 y
showInfo();
/ h1 I. Q6 R6 _* o//限定访问:只能访问当前所在的空间的子空间中的成员$ `# g; \* ^: l$ o5 s' N! B
BB\showInfo();
7 P4 e. Q+ D0 j/ B( Y7 x//完全限定:可以访问其它所有的空间的成员
4 X) E, s' K! a, _: I\CC\showInfo();
8 W. d2 x5 Z  C5 X7 M; [$ w" J↑根空间标识符: q3 f6 L5 i1 @8 z' E9 c9 K
----------------------------------------------------------------------------
: M5 P1 ~4 P2 s1 K1 N, ^) C* d  s0 _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
$ S5 U" v/ b) r" o- Z. o& P  a4 P8 a+ W* N; Z/ s
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' b& S' ~- ~( U. N3 Z2 R, {' v3 t
- u: `* A/ [7 o7 }$ E
代码示例如下:
$ m. g; b) W& j) q' Q% {' W8 U8 v6 v) a! \$ J. a, E* C
----------------------------------------------------------------------------
& n4 j. F; N" H
5 ~, T. _% Y! P- c) G
( \4 N: v; x# T6 s04inc.php
7 M& H' Z/ ]2 |  o<php
0 `1 o- Y9 _- V3 |' D
" R$ o6 {' _1 ?0 M/ @; |namespoc_e Core;
# \" a: `" c( dinclude '05ou.php';9 j2 o3 M" P+ U9 n8 Q7 m% P
new \AdminController();; V! J# ^$ m6 r- j2 S0 F
showInfo();& K/ Z" p, J$ H7 b4 ~

; I/ B9 ^: b$ Hecho P;
% V; n+ F2 C( {//根空间中的成员,只要类的访问必须加‘/’- T2 {% U  @/ f2 p8 D: A; s0 O; J
----------------------------------------------------------------------------- ^/ \' E0 z* s+ S& u
8 i' H- E. I5 W4 {# y
05ou.php
7 O' p4 r' d' o7 `5 l0 U<php( J& B2 h( C6 \  C/ z: w' n% H! @
const P=5;$ m' |  N0 r5 G- P4 {. a7 `1 Z

% z' d7 @' K& j2 e  }# H+ n4 Hfunctio_n showinfo(){
! o! O: v4 p, W! q  l# R) n5 d  R    echo __METHOD__,'<br/>';6 h; Y0 L+ w, M# S* p
}1 k7 ?1 z4 C, ?) K

& W) w* B% e5 k3 @clas_s AdminController{8 T: N7 d7 c& i) k" E7 O
    public functio_n __construct(){9 _2 _$ b$ T* d( Q# j( z
        echo __METHOD__,'<br/>';+ e2 [$ y7 f9 L' ^
    }
2 p* C7 M6 U+ k' F7 P* g9 v}, J5 ^) ?: }- V* ^

3 k# ~1 G. p. C1 |5 }8 @. j, i) u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
" M2 T- O  r' z" B----------------------------------------------------------------------------
5 [: k1 Z5 S1 ?, z6 X* j04inc.php. n9 w+ x' _0 t7 W+ p
<php6 q% U" I; I1 ]

0 V7 X. X! p) ?  onamespoc_e Core;
- U3 t" t0 P# l' ]( H+ l. r3 e7 m$ Minclude '05ou.php';  t/ p4 \3 T& M3 ^* u5 |/ S5 j
functio_n showinfo(){
/ C+ {/ ?' H) }+ _    echo __METHOD__,'<br/>';
4 l( e7 d* ]. D& A}/ Q' `5 _. X6 e  C. E6 W! {* r
) |! ?4 F. U% l7 r. z
new \Controller\AdminController;
7 F/ T# }) N% c) \% X----------------------------------------------------------------------------
0 @6 ^8 F) J9 m: z0 P05ou.php
9 u9 H' U4 d. G; e6 _<php
2 H- F7 w$ N& W+ e$ d9 |  Inamespoc_e Controller;: Q9 ]# ^3 e$ m  E% O
! i( ]/ S, R2 f1 y& S
clas_s AdminController{
4 ~3 e  z" w+ q5 B1 D: C! U        public functio_n __construct(){
" Y6 L* y% H0 h$ ^# J: U9 T                echo __METHOD__,'<br/>';% G6 C/ M- ^  \5 ^0 @
    }
' s" Q% N  f' T0 N" F+ P}
% p, E7 _; t# q----------------------------------------------------------------------------
' Y: v$ X1 m, q0 G" u+ @0 P! Z9 d6 r' e& A* a) M
4.引入空间成员:5 M2 \( S% E/ [# n, r5 s
2 M. R; ]5 p( k2 B: e8 _
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。' H* {0 V: C0 l' u2 M# H- Z  y2 |2 l

/ T( K; J* _" o& N- h1 d- p* L----------------------------------------------------------------------------2 f4 k/ l& L1 f  w+ x9 |  Y6 c7 @

" J/ A2 q2 Q& a1 @3 T& i04inc.php
0 t# M9 u* b# x' y' ^& C7 h<php$ l0 K, P9 N- i0 T9 H( p7 {
namespoc_e Core;
5 a/ {1 M* c$ H( d# ruse Admin\Controller as con;/ F2 i0 x1 O4 F  A0 D7 m5 C* m

8 K2 E# ?. X! }% ?include '05ou.php';
' c9 {! z- x# _/ X9 j& [( f1 s6 D
% l8 P9 W- |0 Z6 o3 U$ wnew con\AdminController();
  B; I' ]7 K+ D- c; {----------------------------------------------------------------------------) ?/ r' h( Q! J# H
05ou.php+ z/ ~7 u$ U( Y+ h) w4 T
<php
8 _. q+ _' N* N9 h" ]namespoc_e Admin\Controller;
3 _6 h( M+ w- E) L6 B
  u# {% B8 Z: [0 k/ I6 Y! Lclas_s AdminController{/ K2 o4 N' V6 k( {& f
    public functio_n __construct(){0 J- {. y8 m0 }: x* K% s
        echo __METHOD__,'<br/>';
0 g- c$ l8 G! r    }
2 C0 [- [2 c% n}9 S8 V2 A0 a. N6 L8 q" P; L1 {
----------------------------------------------------------------------------
: Q+ w9 H' W/ b2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
3 r9 g9 n" {% N8 Y
) Q2 ~9 F5 Z& F/ p: S----------------------------------------------------------------------------3 W2 _' q% e& P* i( Z
" @! I  A/ m+ U2 H5 D$ a
04inc.php
( Q8 j# U, f* _3 U" L9 ]<php
  _, N% f! Z$ W; m2 C4 G! `4 o//引入空间成员类; R, [% m* D+ R) c5 g- h. W/ h! w

( F/ Z# u; n; q; w1 B2 {/ ynamespoc_e Core;
# c/ g1 ?: e& Q8 kuse Admin\Controller\AdminController;
0 M9 L9 K* ~1 t' C# X0 n+ einclude '05ou.php';. a, B( Q# }0 s* _3 F/ ]( J+ d; m

6 R" ~& u4 b5 Q. |# J6 P! Z) m# [# Dnew AdminController();
& X8 Z" a- u. |' `9 m, |- B----------------------------------------------------------------------------
7 O. V4 X1 o- V; v05ou.php
  U9 ]+ J1 p' E: y! h/ G9 K<php
' @4 Z) c" H$ F- h1 N/ [$ hnamespoc_e Admin\Controller;
' N" r( l! B! w
+ Y  s; O1 j" t2 qclas_s AdminController{# R- J! }/ v* k( K7 }$ ?2 l
    public functio_n __construct(){
5 X8 L) G4 e. L9 {2 c0 `1 W& y        echo __METHOD__,'<br/>';
, s% @  K" Z9 ?$ T    }) m: V# T9 ]+ X1 y8 b& G) m4 R
}5 j4 ?2 n( c9 z% o% z, D
----------------------------------------------------------------------------
8 C* y: a: B) k$ F5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
; e. _2 c: c9 N1 ?0 y
6 t( n. F* i4 f  ]' `) o
8 w1 ?% C" B# d$ R: w$ ]/ L这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' M  O' _, D) G
; a; P3 o# j; N0 x
* T" U, X6 c4 Y+ C

. l' y8 x1 i2 j7 q; I, }( m3 @- }3 v4 D2 b3 [" o* E0 _

7 A8 O, p, ?! [5 k% O1 p8 n" ?5 J- a  V# H" y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-6 13:14 , Processed in 0.110886 second(s), 23 queries .

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