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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:8 M$ ]# P9 R- S+ o0 z4 t
7 z2 U$ i- _; H, r6 c, C3 B
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:* D9 _3 V6 t8 U8 ^

0 i+ ^) f6 I3 M" H0 t 2 Y0 i6 Z! Y: Z4 V
: {4 X3 b# ^0 j. e
我们来详细的讲解一下PHP中的命名空间:" a3 J: m: p8 I- O* {
  ^4 f- i5 O8 F+ Z5 M4 [; n, {
语法:namespac_e 空间名\空间名;
1 y, t/ w# {* F5 l
2 k# q5 ^; _3 C1 Q1 O* ]说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 k" f% f8 p( p/ x2 v* T) [0 F
6 o& B1 k: z1 b
----------------------------------------------------------------------------
6 \, q" C' j4 G2 p- B5 W& ~! [* @+ s0 t% \
<php
! j) O2 |8 A4 a9 [3 R6 D
& Q, f4 ^% {# M# q- T/ vnamespoc_e AA;+ v; m0 L6 Z# s6 T; {2 r+ i
functio_n showInfo(){! w6 r( c& T0 \2 V, g9 I
    echo __METHOD__,'<br/>';
1 R' ?" S4 I! e4 v) X}- S( J% j; D9 ^8 A! k# g% n' _$ E
showinfo();
& F5 \! V# `, q$ e9 ~6 T# C* a. E. X8 B
1 k# ^' ]" j  w5 }! ^* Nnamespoc_e AA\BB;! A3 d' `- S9 d1 ^1 G4 i* C) H

, ~  f; P5 c7 x8 [! \functio_n showInfo(){
, P: l# Z( n1 C# J( N" E$ A    echo __METHOD__,'<br/>';
0 j( A+ v% h1 P. b8 Z8 P$ x/ v( ?}
; N, x3 ~1 L1 p# N! ]9 M//showInfo();# B* {! {+ T: C% ~' I$ b
----------------------------------------------------------------------------0 u8 X" L6 H, h0 z# W" f
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)4 D+ Q8 F' s* f7 I3 V  @
: }3 u! m! M0 v7 H5 n6 L3 }
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。9 m8 H2 W4 h- `6 B- p; C. M

8 K* L1 J2 o1 f+ \; _----------------------------------------------------------------------------
" L) }3 j7 ^: d2 }
4 i$ M8 H8 n3 o+ N! J  `<php
9 W4 q4 \/ ~4 ]$ `namespoc_e AA\BB;
) g$ W9 `! }1 ]4 |. Rfunctio_n showInfo(){: k, Z  D/ W* q; N4 c& O0 C# S6 Z4 d6 m9 |
    echo __METHOD__,'<br/>';
1 S( Y% W1 X! g}+ {! y3 q# |* g
namespoc_e CC;( i$ N* y3 }/ D+ m$ R
functio_n showInfo(){/ T6 f  K: W: C$ x1 w: L
    echo __METHOD__,'<br/>';
: V' C! _- m$ n: ?$ M}0 i  {. X4 D- p7 H6 P7 L: q
namespoc_e AA;
3 ]+ }' Q+ D; L+ `, N4 `& y0 [functio_n showInfo(){/ U8 Q) B. R) c" L
    echo __METHOD__,'<br/>';% U% y: s6 J2 u) ^1 O
}
# I& P* D$ w) A) M" J//非限定访问:用于访问当前空间中的成员
* I* _$ C# r( t8 A3 m" Y9 M# WshowInfo();1 X6 n1 Q# L  z  n6 v& B- X
//限定访问:只能访问当前所在的空间的子空间中的成员: @* e) ~4 F9 _: z; b
BB\showInfo();" Y5 `5 V6 v# g3 g6 A  J( c
//完全限定:可以访问其它所有的空间的成员
/ `# s& K/ x" y' u# O) G: E\CC\showInfo();
8 `1 B# O: E0 _7 O) ~! V↑根空间标识符
5 l* {% N5 d. Z: z/ Y  w% o----------------------------------------------------------------------------* ~% k% S4 W0 y) }: S9 O4 e
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
' G9 ?, s7 |- ^6 N/ U! |  \6 K  T! z9 c  ]2 A
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 E7 r0 t; ^" }9 S- {
( W8 z1 a1 b  z/ S6 s* g1 q代码示例如下:- S4 X; H. h" V& @- @: }

# |6 {: ?/ A4 I9 Y----------------------------------------------------------------------------
' N3 i& ^# X! Y& `# B6 o( y  R' m8 p6 |7 }, X6 d

0 O/ [) U3 R' v# |3 V7 ]04inc.php7 L4 B3 c' ?3 a. Z  x' z, F
<php
# v  X7 H8 B; T9 o% [) a# I. r1 @8 |  d
namespoc_e Core;
/ r6 S  E9 R/ F1 L6 o/ n& ginclude '05ou.php';6 K& @  _; X2 ^1 x
new \AdminController();
& }) {7 C% B( \" C: ushowInfo();4 z' s7 }+ ]& E# ]$ d* l
+ Y1 b+ d8 O' \& ~7 x0 \' d
echo P;
; i0 S' Y3 b5 g- a//根空间中的成员,只要类的访问必须加‘/’( d0 \$ ]: [. F0 g+ Q5 Q* c
----------------------------------------------------------------------------: X1 a' {, P. \3 M5 u2 H
' l: K4 e  F$ S! l8 _5 I; X
05ou.php1 p  _+ D! l4 N8 B" e! Z
<php7 R) C  f2 V5 O$ ]  u
const P=5;
) n7 R  N; W/ @8 G* H2 z# J, c5 }+ o8 {' v; t* x: C7 d, j
functio_n showinfo(){
9 n: A# q; \' y; J2 w6 P    echo __METHOD__,'<br/>';! I9 _. t2 T2 o6 j* M
}
# Q3 x" b5 k9 L3 ~! X- i$ u- o; c5 F4 K' z4 s9 m
clas_s AdminController{+ w% h, U3 K% u! T
    public functio_n __construct(){
6 ^: j  l+ w. F/ e4 [2 A8 j) t* U        echo __METHOD__,'<br/>';5 A' W" p& w) ?- @4 E; u, C* g
    }! B# u7 u) Z3 |) g. \/ ]
}" m7 Q- K, B- b8 l2 q+ {
1 M9 g! L, E% ~- s: V* y
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
1 F8 H5 l; r$ K----------------------------------------------------------------------------( i3 _8 a; c4 V
04inc.php
3 a$ Q4 d7 x( C: a+ s<php% v2 w0 p% d0 c" n! G

- q# r6 j$ X9 l' Fnamespoc_e Core;" O9 s9 Y' l3 T: R0 ~4 k. p
include '05ou.php';* x) W& ^, O" R, _
functio_n showinfo(){
& [6 R( e7 f, F% \, V. `9 a    echo __METHOD__,'<br/>';
" ^# f; ?# A& F& g! p}
" ~- I2 b7 h, u) _5 M# i2 w5 A8 A+ E: v& t! a% {" H" D: k
new \Controller\AdminController;
( _! ]2 L2 K. |6 R6 i2 m, u6 r----------------------------------------------------------------------------
+ c6 W+ f3 B% t05ou.php
( T* @9 S9 g; E7 ^" H( n5 w<php
" M. y0 J6 H1 d* Xnamespoc_e Controller;
: `+ y$ B. a7 h' N& n
; ^  x: a6 X3 X4 Y6 a7 Tclas_s AdminController{
- C* a6 t- B* H* M  M  u        public functio_n __construct(){
( [9 A6 q2 C# ~, P' c* S2 o                echo __METHOD__,'<br/>';
5 ~2 y  {9 c: ~: Y    }
# k  D5 O8 H0 ~( v}" q8 k; j8 x0 U/ E5 R( v
----------------------------------------------------------------------------2 Z+ v# q  u1 x8 s. i6 G

& V* P6 S1 T! l1 U2 S/ S& P* q4.引入空间成员:
/ S. \% `4 M4 b# Z2 G( A1 R7 Q% m% T
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。8 y7 H% b: c! y% B1 t
+ t6 a" d, Z7 R/ a% j8 |1 H: {+ q
----------------------------------------------------------------------------
" f: z( `( @# L. k5 B8 \6 M+ S* P' _0 [# R6 @* m& }0 K
04inc.php* s4 y2 E  s# [% {7 D* e# s" F
<php
. [* Y. {% F) u& E3 n7 Rnamespoc_e Core;# X, f) x8 u' r: Q6 M0 s  X* H
use Admin\Controller as con;
$ H% s7 P" f' x, v6 R2 r1 G0 Z, E1 j5 E
include '05ou.php';
  g( M# e. [$ ~. O* p: N3 q4 b
' W' o' d( \! j) H' b3 v% mnew con\AdminController();
, |9 d+ i' S8 \" p. E/ g' {----------------------------------------------------------------------------( A. ^# j3 f7 e: Q7 N
05ou.php
( H9 @6 a3 P6 E7 {/ ~0 F4 v<php
# Y8 V  E. h1 O5 E* s7 F; S! onamespoc_e Admin\Controller;
' G+ L( G8 h  z
5 _0 H1 l3 r6 J% x8 @7 f1 Fclas_s AdminController{
) `& ]/ W' {9 D/ R- a. K/ N3 C1 l& l    public functio_n __construct(){
( C+ s' J+ }- W  _* e* T        echo __METHOD__,'<br/>';
0 O4 Y( s4 Q  f4 L: j    }. N5 K7 u3 D% t- g
}1 X' g2 D, O7 j3 T% e- F0 r# G
----------------------------------------------------------------------------
0 ]; e+ b4 T4 p8 }  x: F2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。/ Q5 Q% H6 b0 q/ F# d% A# f7 C
; T- D/ @7 T$ k# f* l3 _6 B
----------------------------------------------------------------------------
" V( `* W$ }" j. d4 w
' R- B$ M3 o$ E& ?. h# g4 H04inc.php, j* w$ j3 P4 ^8 z  _
<php
8 j( w9 i) a$ o' ?% \1 n; T6 e1 a//引入空间成员类
8 T' i3 b% d6 m. |2 Z4 [: j, Y& P- `7 ^$ Y$ }% I2 Z
namespoc_e Core;
, G2 M# B( ]" R3 P: ^$ k& p( k. C+ Duse Admin\Controller\AdminController;2 |) e& e* z0 W
include '05ou.php';
( ~+ A7 Y, H9 Z) e
( ^% T8 o  @( u; u  f, k0 u+ U/ |new AdminController();2 Z1 h' R3 N$ [+ n" Z" C5 c1 Z* D
----------------------------------------------------------------------------! ?5 E8 }6 p2 E( j* b4 L/ n
05ou.php7 {+ ]; W. Y, c0 q# W+ D+ M6 f3 H7 w9 E
<php9 f6 R. K# ?8 [% g
namespoc_e Admin\Controller;
/ C% [6 |: G& \' B1 o5 W
$ K5 R: e8 x% w/ F' V/ J" F& w, F  wclas_s AdminController{' v7 e/ ?, t  @/ p
    public functio_n __construct(){
! N) T5 `4 D- H/ j! ^8 u" n        echo __METHOD__,'<br/>';* A$ a( [$ b" E% ~/ q
    }
) H5 i/ h6 w2 I  B- u7 ^1 R}+ m# E4 N+ D2 t" D" ~. l) L7 f
----------------------------------------------------------------------------
* v- ]% m" F' a! ~! h/ w( K* `+ E5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
2 L' v; n. ]: |
( j0 r  }4 o5 n% F1 g  F: Q
3 K/ G) @7 L6 i" s这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" b) Z- j& Q$ l8 H' D. G" w4 u/ M# O( B6 s9 Y

, _$ i7 P3 q2 C  z4 i* ^& t, X
% M; I) W& V8 E$ g/ u2 i: H, t
7 P* n/ W! |' `0 U2 I# |% B8 Z' s# p" e& W. ]
/ Q, H. s& g8 A' p; ]3 {" z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-27 23:27 , Processed in 0.132161 second(s), 24 queries .

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