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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:! @) R6 l6 e( F; q

! N0 i0 t; {. g+ I$ A2 d2 a在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 d/ f' ~* a0 j5 ~: y* E/ i4 H
; _0 Y5 D9 D4 N0 K$ D

$ W; ~. @, v' U" I0 q4 c+ B# v* T+ L  T6 p! c0 x
我们来详细的讲解一下PHP中的命名空间:9 x6 N1 ~" |& N% x- M

3 J6 b  [& G; `8 f! ^& l语法:namespac_e 空间名\空间名;/ u1 X' U' ~* I4 m+ D1 `; y* D
. t- G5 Z8 c& u8 c  U* ]
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:& ~1 n9 d2 ]- ~: t# Z

' F$ {/ h+ S% ]1 ]8 |% G----------------------------------------------------------------------------; W0 `! Z: c1 F5 C1 \
) j" v: h8 f% V/ z4 a
<php6 E8 z9 @' B' F* E  G" R, ?
/ u4 [! I' M) S0 C
namespoc_e AA;
4 O5 n! `9 x0 `( Qfunctio_n showInfo(){2 N, W& ]! P- a8 q) f3 {' t6 a( k
    echo __METHOD__,'<br/>';( ^$ y( S) E4 V9 n, Z" m$ V% ^
}
& i* `1 B1 W, J/ T4 c6 A, c" nshowinfo();7 D, Y" t2 D1 }2 b1 @) }
$ G) D, U9 ^( w% k4 V# L
namespoc_e AA\BB;  T* i5 w3 o. w( a& s, `- {- O) U
7 a) c- w) |: o' K; G$ t
functio_n showInfo(){; z5 _; K2 P3 [' c# o# s. b
    echo __METHOD__,'<br/>';8 i; e1 t9 I  V* N1 }
}
, G( }* N/ J+ q9 W- M//showInfo();! e# S% c& I: x  \" l
----------------------------------------------------------------------------
9 @+ p% I5 I) u2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)0 n) q: K4 x; C$ K( q; g1 Z" ?
; M7 W3 c2 d/ d/ c# Y! e
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。: _) }% Y; i# V3 A5 q
$ `# T, Y8 e& l3 n
----------------------------------------------------------------------------/ k' z- X3 t& l
# C: H0 b  g2 P1 ]% O9 J
<php
& B2 r+ ?. S* u! Pnamespoc_e AA\BB;
' d% R1 S& q9 C: d7 N# jfunctio_n showInfo(){
$ @6 n8 R0 X6 C  [7 `7 d; M    echo __METHOD__,'<br/>';
9 h! m- t6 B& M1 A- e  i' C2 b}
1 \5 v8 ]1 f  q6 {4 ~: _namespoc_e CC;
+ d$ E' q3 V6 j, m, Kfunctio_n showInfo(){1 J# ]. z! G' R
    echo __METHOD__,'<br/>';
5 h2 }9 ^& i4 e+ t; T1 K6 @}4 D/ I" ?  ~; S; Y& d( M
namespoc_e AA;
# s4 Z7 I* M" z* ]6 mfunctio_n showInfo(){2 ]# |. j0 h4 Z/ B7 E. _
    echo __METHOD__,'<br/>';7 D) u0 V( U9 g9 B4 c, z( A
}2 M. N& R; ?( X& o; u- b+ J1 r2 H
//非限定访问:用于访问当前空间中的成员
' g3 t$ M0 t0 y& |# B6 {* r3 zshowInfo();' {' V! w) ]9 t1 C, X2 I
//限定访问:只能访问当前所在的空间的子空间中的成员8 ~4 O; X8 P9 X$ g  F; b* X% X
BB\showInfo();
3 ^2 M/ [8 ^( w# _/ }//完全限定:可以访问其它所有的空间的成员
6 O& a& A$ N9 I( H6 P( z2 A2 l\CC\showInfo();
' t3 ]/ g* h3 G& f4 C# I) P4 Y+ P0 f↑根空间标识符! `( _6 z$ H  E9 J% R
----------------------------------------------------------------------------
2 m* l3 H( }5 Z* o+ ^2 ~但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:! f  L0 U# ?/ P
& ]' [" u8 P2 m" V1 }; E* X$ u
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
# w+ r# W* P! J
% R4 }: @9 d6 f% `1 f8 y- b; J- ~1 G代码示例如下:
9 r- F( Z; @8 G  E* o; n
  C/ \. F# t7 c, S% g" S----------------------------------------------------------------------------
- W, |$ u7 t) z6 \7 I- K2 S! E8 X6 G2 H: O4 V" X
* _5 F, d( ]* z3 M; f0 ?8 k: y
04inc.php
# L" A% h6 N/ _9 n4 H* [) r! l. O<php
* Z" D0 M; m/ w! K- F  p/ Y5 w5 I# }) U5 \4 R0 ]9 u
namespoc_e Core;
) Z$ }8 L, P/ _$ R+ K5 J  sinclude '05ou.php';- [7 Q$ F3 f  t+ i. X# N
new \AdminController();. C) d. ?8 p) p# q* o* g& O' A- i- v
showInfo();
- q* M, Y9 o% ~7 o7 O9 ?1 P# ]+ K5 W6 @; F9 {3 D! h0 _
echo P;3 f: o6 ]' j  X9 w
//根空间中的成员,只要类的访问必须加‘/’
; `" r: A7 d5 X3 w/ N, L! _----------------------------------------------------------------------------
" d' y; h' i* _' x1 }
! a$ }2 ?# ^3 z# H# P5 u05ou.php. C) A, f& b& d" {7 F! V9 S
<php. w+ q# s8 x' T/ L. ^5 `, q
const P=5;/ C1 m! E% C6 H# [# X1 v& v7 Q
& V+ R- B! x" S- `' ~
functio_n showinfo(){2 j1 ]+ b, A6 f& |* [9 q% [
    echo __METHOD__,'<br/>';" w; N  ~1 }6 {
}
) C9 U4 W; H6 o# @! C( B
! g8 M9 [. D# j! `8 W/ Pclas_s AdminController{
* f' S% ?3 {/ _. N6 D" ]    public functio_n __construct(){
5 q% ~7 \" k+ [        echo __METHOD__,'<br/>';1 v% v- [& C* a2 s; i4 Z' V5 h
    }
0 ~- k; k: W  B# G4 `; b, y}
2 Z  i; V% b9 H& u) Z. K! N( z" ]  k# t+ C* S% I- \1 d
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: p6 ~& s: A) I1 Q: n7 |
----------------------------------------------------------------------------9 y, ?3 ^$ b4 E0 E3 q7 Q0 ~
04inc.php& Q1 I6 r. V* @7 w! G5 b
<php+ R6 p/ c6 H' v) a% y& D
) g5 e  V0 i' P6 W6 U
namespoc_e Core;
; z& O# V( q( x: W8 @include '05ou.php';
. B4 z& s) a) c) X) ~# J! a# qfunctio_n showinfo(){
) ^# B: M' z7 ?1 h- ?! @: [- z    echo __METHOD__,'<br/>';0 b! }1 q: y7 R, J
}
% I/ v6 K& ^# e* K5 i
5 x, F4 f4 }  F6 ?new \Controller\AdminController;* Q& n/ e2 T" N6 I( S
----------------------------------------------------------------------------
2 j! y$ ]4 v7 g05ou.php0 i9 Q. @2 j5 v3 H5 t( k3 Q. ~
<php0 H5 M: q; J. R% y
namespoc_e Controller;
! ^7 u- E$ N9 h! U! m4 d! t3 _+ Y+ w' V3 M
clas_s AdminController{
- Q, @1 n- d  g5 T        public functio_n __construct(){
" [4 N: y9 K" N! H' a( O                echo __METHOD__,'<br/>';: Q+ d# @$ a4 q! O0 c
    }
% D$ S0 X* x$ F0 Y) W" M! z; D}% g9 W* e" z/ ^+ N- w
----------------------------------------------------------------------------
1 u, N/ i  q; d' n2 K
" O8 c$ E) D; t# p+ P- C9 H4.引入空间成员:5 }0 k/ l& G' v3 W

# a( K9 ~: M; R1 |# t3 q! g' Z1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。4 N$ O) T2 A6 S& Q8 ?; h
% v4 O% |" W5 x/ d3 W0 T4 W/ Z
----------------------------------------------------------------------------2 N7 k/ ]! f2 {0 A
/ K" c$ R" Y& \" b# `/ t$ W
04inc.php( e! e; x% ^: l9 ~# Y1 i3 ^
<php
- J. s4 e! v( H" @+ pnamespoc_e Core;
* B) v3 T; P+ K; s" M0 Vuse Admin\Controller as con;( k$ t6 [4 z+ p! h

2 V/ L: r3 k) q: e/ L! ~4 L( _/ Oinclude '05ou.php';
* i# e* }1 U4 Q1 r9 {) Z- G* Q/ U6 {
5 I, ]- O* g' _  G1 T0 pnew con\AdminController();
! Z* t, u1 ~+ u5 J* @9 O! Z9 H----------------------------------------------------------------------------
. @) y) F- ]2 R05ou.php
, z4 ~7 A% Z' a" L7 l<php6 m2 f$ H6 n: K3 I
namespoc_e Admin\Controller;
3 b' n+ }" n' B0 R% W" Z5 u  c9 u' I, {% A$ b8 l& E' T4 d
clas_s AdminController{/ v+ _, c# Y) u- \! ]
    public functio_n __construct(){
# f7 }4 P  [$ t) z. [/ g        echo __METHOD__,'<br/>';
! S( H7 A0 r) F7 F3 J+ L- T    }' e- D4 W# x6 F  @
}
6 S5 `5 o% W( Z' `# [----------------------------------------------------------------------------
% C4 R3 b  g, P' r2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。/ _) m9 h7 U' j- ^% n
( N; I; N" q; V3 Y
----------------------------------------------------------------------------7 b" _* d% l' G" e1 K& F' B
0 m& X0 V) a/ _2 \: Z
04inc.php3 `+ f: S' f+ v7 G& l2 V
<php, K6 m, s: n0 d. H) [' p# ^
//引入空间成员类
' _4 k  O4 W% X  L9 Q, R
1 B3 A" J/ M, Q' K' [! }namespoc_e Core;$ i* J% c6 S: n- p
use Admin\Controller\AdminController;+ r" q2 |* Q: Y1 P3 d
include '05ou.php';
* T, ^  W: S4 h; l- ~8 o0 N& h+ v  B9 ]( p* A, n
new AdminController();
7 ]8 l# ~) F3 l3 ?- [7 V----------------------------------------------------------------------------5 ~3 o! j# h8 C2 Z* k% f1 R
05ou.php' d& l1 g  y& S
<php
; n" w% s# |! f! `! t% g& O  znamespoc_e Admin\Controller;0 d, Z) S; b' u/ J" T5 B/ Y
( W$ L$ C1 e' T& J' C3 |
clas_s AdminController{
% g6 T4 I. ^" W- `& r    public functio_n __construct(){# Q2 {8 t1 `3 R4 f8 i
        echo __METHOD__,'<br/>';
4 x+ ]; B: z# q4 v2 o! ~( [. u5 k    }
+ q; T& e( m; ^9 a1 b}( l) y: e8 e) j; V" G; I
----------------------------------------------------------------------------
, V1 \' C& T$ H0 G: ^8 i/ E5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
2 }! y. P9 N% U' L! n. q7 g3 t8 }+ w: M* X
) m; b" p' {- S# l! L- u: Q
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。" y2 q( |  b+ ?+ X$ v
( ]/ B- y1 U# ~* T9 p
- H) v% Y5 w) `! S9 d

# Z; S" q) L( T% n  e2 `+ |; ~8 q9 r$ \
1 O9 x8 P: \3 L! G2 F# V
# R, o7 H# X( S+ f5 P  l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:18 , Processed in 0.116634 second(s), 23 queries .

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