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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
6 O, k# [+ |1 j# ?" i6 w7 D; @& d7 y, A! T- s3 y5 U
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 Z& i0 \3 R; k2 D) L5 D) B
! s$ ?5 |5 J' {3 R

, m5 g  z( @' Y6 S3 i! G& R( {3 B& p7 G# W
我们来详细的讲解一下PHP中的命名空间:
/ V, F3 Q5 S3 z! h
. A0 V; j# J+ G! f语法:namespac_e 空间名\空间名;' X5 O  U2 P3 l  L& J' v4 g

2 E1 u6 @) o; Z9 q" ?说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- G6 Z5 J7 D' o
0 B. i4 w* l9 P5 m* L7 M: z
----------------------------------------------------------------------------
& x5 P; U+ ^* ~* f. C$ {* r* ?# F8 u$ k8 }% _- W2 C! O
<php
/ e+ {. P2 E0 |3 |% C( ]% @( b3 |1 {3 P. J  S  R9 }# v
namespoc_e AA;
: }6 m; D: e/ o& p! E: u$ a$ Efunctio_n showInfo(){7 M* H5 }7 j& m. I
    echo __METHOD__,'<br/>';
  Z+ @- A/ ^' D}
+ s9 w) {* M5 g) Mshowinfo();1 N5 f4 E0 w1 u

/ C7 p/ \1 L4 N5 o: h$ @9 d& }! \namespoc_e AA\BB;
" Q  |( S% D+ o1 a$ J, ]  C+ G
3 P" W7 _" _2 Gfunctio_n showInfo(){
! h% G( n) ]2 C# q" R    echo __METHOD__,'<br/>';4 k( }* Y, f  V4 L( q! E) J; i
}! ^0 U& c+ W/ z
//showInfo();
1 @9 R. _. h# ~6 i) H' U) g  J----------------------------------------------------------------------------
$ K1 U/ A+ b! O8 ]2 W: F2 \2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
/ G" h* J; D6 m
% G! B9 A; W( _) w9 w3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。% g. B( B' [7 o7 ~0 \
1 h% e' J( a! b  Y4 |* u
----------------------------------------------------------------------------# e* `- i. X( ^& y; z" a
! J* K. R3 e' {6 h9 ?, {6 C+ s& W- D
<php
0 q9 t* t8 @: Q0 o" S4 R1 v& znamespoc_e AA\BB;1 |; P" n/ f9 S! T' ~5 n
functio_n showInfo(){
% s2 c8 r4 u( b# n# S$ O) A# q5 U4 E/ Y    echo __METHOD__,'<br/>';
6 j" V$ `: ~6 u9 `  k}
4 [  {. _% T* V8 y: K  Y' Mnamespoc_e CC;# _5 z* m3 z3 P
functio_n showInfo(){3 W2 Z, B; s! F. i
    echo __METHOD__,'<br/>';8 K/ `. X/ {" x* s6 l
}2 e  Q: E5 b3 U( Z" M
namespoc_e AA;5 G8 e: W) }; \
functio_n showInfo(){, t* c$ w- _; a, C# P
    echo __METHOD__,'<br/>';% ~- e" l5 _* Z' s& q! O6 D- V
}! v( a% }3 t) ~9 [7 ]8 n9 d5 e3 F
//非限定访问:用于访问当前空间中的成员
9 x) H8 n0 H. w1 @1 s0 A1 ]showInfo();
/ L$ R' a  |& O3 Y//限定访问:只能访问当前所在的空间的子空间中的成员8 |9 ?8 i3 y2 }, H9 X& g4 g7 Y
BB\showInfo();
7 l* M% P. Z- {& D' }+ M//完全限定:可以访问其它所有的空间的成员5 {! R9 n8 \' s2 F+ I$ O& _
\CC\showInfo();
5 v: Q% e4 h/ j↑根空间标识符1 @8 S4 t; h& v" d1 s# O+ ]
----------------------------------------------------------------------------1 T9 O1 N! `2 q% v, v$ _1 P$ p# ~$ H
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:" i/ S6 f& y+ Y6 h' d3 N& e% f
4 P$ X' E4 _$ S# h3 t! s7 z
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
$ o9 i0 K6 E4 _) O% V& u& W  q4 m
) [" m9 e& Y' k; b代码示例如下:
6 Z% v; H! h/ o, T5 w9 J4 V# H5 A) x2 e" ?% @
----------------------------------------------------------------------------/ f$ |8 Q1 z& N7 [* L. O
9 Z! h( x2 ]+ M! z: ?2 w

0 c# Q2 f) h0 ^2 T! F04inc.php! c+ q2 B8 p$ s: P2 O# h
<php4 y; Q- A5 b) {% ^; t

. \8 e! {- c3 Y# }$ {7 q3 wnamespoc_e Core;' @2 b7 v4 ~1 \: O4 H  j, t8 x
include '05ou.php';
: O1 n/ O, |/ Znew \AdminController();
/ {) |, g7 L8 ~6 E: D4 }showInfo();7 |$ T6 @6 \$ _1 h& o6 D5 `6 ]
! \1 O3 W+ b) H/ p
echo P;
) v$ G- {4 Y( R  f. m' W! h//根空间中的成员,只要类的访问必须加‘/’, {9 Z- ^* f" e' N; d" P
----------------------------------------------------------------------------
. w- i9 {$ j2 P5 @
: l9 l' i, Z: N) f$ Q. [05ou.php  {/ R9 P4 j5 L, P+ w, R& g
<php
; f. ?# F/ I) ~6 x' o! ~, X6 ~, Dconst P=5;
( u$ L: j  }/ c# B# T8 ~9 M5 Z( x: P1 G( q4 R, O! Q1 R
functio_n showinfo(){$ w) }, y: l3 ^" r0 N7 u
    echo __METHOD__,'<br/>';! b% ~! Q. I8 O3 n# F- C; V6 g7 `5 Z
}1 f* V$ A* J7 q  R; w
, K7 G5 x! h1 j
clas_s AdminController{- ^6 r7 J8 b* h" J
    public functio_n __construct(){" F" @, A2 X) J6 V
        echo __METHOD__,'<br/>';- S% k. o! t2 Z0 ?  o; r- }! J
    }
3 Y. D' A- O- W}+ }( _9 k; `* |# Y# l) Q5 z! q

# t1 a+ x8 N9 ^2 z% \" H  Y第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。5 {+ |7 e4 R# c8 {; D* d
----------------------------------------------------------------------------' z+ F# U! _! e/ n6 I
04inc.php
# ~" m( U/ O2 y# A9 }<php; c# C. N7 h8 l1 ^3 p6 _

; h; Q% A7 e7 X1 S) xnamespoc_e Core;3 C  K& s5 }; L+ ~3 k6 ?& y
include '05ou.php';- A% `" F/ _6 v" ]* W6 H  v% l; a
functio_n showinfo(){/ h" s& D( V; K4 B8 Q( k
    echo __METHOD__,'<br/>';
, W+ a/ A7 s7 b  L/ W+ `}
) q& p* Z5 O- [
; h# Q7 ?5 c- A% o* o. ]new \Controller\AdminController;+ c) L" _$ J, i, V7 n. f6 A; O
----------------------------------------------------------------------------
3 i1 v8 t, P7 L05ou.php
, d! s( G! ]  Y1 E, Q& X+ Q5 O<php
7 F6 E" v  a& B- |, q+ s5 Cnamespoc_e Controller;
: w& g( D0 r% A& w+ D: B+ A
8 J2 u, e2 ?' s6 ?/ u& x( h( l. ?clas_s AdminController{$ t7 l4 x+ ]3 {% L. H% d
        public functio_n __construct(){
2 I( l. P7 M$ s2 P0 v                echo __METHOD__,'<br/>';  J+ [. Q/ p$ T# Q
    }8 T2 F, D! B2 I) v) D$ s, [5 k. ]3 V
}$ C" m8 `! k* @, {2 w- n
----------------------------------------------------------------------------3 ?- P# y* v7 V5 `

7 d3 j4 J( I8 s2 ^* C- f6 {  [5 n4.引入空间成员:
; f1 O7 N) S- O2 o& r
& o! W) {3 L( y# z  K0 N1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。+ y  q7 w$ s+ |; z3 t( T" M) A
0 O2 Z/ q) A7 a; v) z
----------------------------------------------------------------------------7 |& L  G0 f8 s* X

; z) g1 s) y. y, j04inc.php7 ?5 h7 ?/ h9 K% G- J) l
<php
' V( S! \* h6 u0 dnamespoc_e Core;
6 Y' C9 l6 Z* B) {5 N; duse Admin\Controller as con;1 y  v, u7 \) q, ~2 L7 G

/ }3 A" D+ e9 b9 r& R9 ^* H; v, y, ?include '05ou.php';7 u. F( U! T) g0 u
; l) t+ ?0 j4 J) H+ }$ _0 p% I
new con\AdminController();
9 G, S" y+ L1 j+ S6 X----------------------------------------------------------------------------
; m! N0 h! R3 F; G, ]: Y) v3 r5 M05ou.php
3 e" p. |3 X! u5 d<php: E! d9 W0 q- i4 W7 [! ^! U$ B
namespoc_e Admin\Controller;
- h7 K- ]! `) P# p- S5 P' W$ L  M- t0 j! {/ Q
clas_s AdminController{
" C9 Q  y9 K/ p+ M' H" Z    public functio_n __construct(){" d$ O/ O* O8 S3 h$ A9 \0 N
        echo __METHOD__,'<br/>';6 l: r) I1 T! z9 J. I
    }! p& j6 }6 Q6 J6 y1 f
}6 V) D& X, l, ~0 K4 c) u5 J
----------------------------------------------------------------------------
) A$ v  `8 A* Q, D" u2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
3 k% b5 n; T+ s# T' o, i* `: W. m! Q
----------------------------------------------------------------------------5 F# Q; ]. y: q; I

8 |- b# Q9 V. K2 M04inc.php
4 `5 J6 w: b9 K7 a9 h, M. c( C- m<php4 K- V2 Q! K" _6 w  s. h
//引入空间成员类
5 g0 T7 [# o6 |  [6 J1 e
" v( R  J1 e5 |' x. ~namespoc_e Core;( u7 e7 [. o0 S. l
use Admin\Controller\AdminController;0 Y4 [& {% w. G
include '05ou.php';
2 E  n2 L7 E  n$ Y4 W( F& S7 y( V2 A1 {# m4 v' s) D, m$ Q8 {
new AdminController();
6 \0 l8 b2 y  N! {% ?" `: G" k----------------------------------------------------------------------------& ^, B9 N$ p1 E0 }, @1 K& s8 {
05ou.php
+ R% y/ S# H* C8 F1 L& I0 u; ^<php6 ?$ E( L. z& C2 N" }
namespoc_e Admin\Controller;- H4 c8 N/ {+ o+ I/ S# m9 u+ U! ]

1 }7 v( j. N! F( l' l# o- bclas_s AdminController{& C4 P" c- x8 M
    public functio_n __construct(){. Y8 r0 }7 G$ j# C: I% k. o
        echo __METHOD__,'<br/>';7 Q- g8 b5 w9 D0 B6 o
    }
* y5 V1 U+ U# \# c2 Q) k% J}: S: a, ?# @7 T
----------------------------------------------------------------------------$ z! O" i3 u( G& }! _$ d& I
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" T# U" {1 @) u
" a; J1 h1 L! S1 ~. h, @1 ?* {7 n. i9 c+ j* o$ V2 b) [
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。1 A# u% L+ {2 l! n+ p

( u; K) F( R5 J( ^" p6 l9 Q$ F6 o: K0 c
0 L: k4 n; Q* Y) Z. h( i

4 `2 K9 \+ V0 R! L) |) z. v$ f8 [2 f& u1 g+ s5 n0 X
3 N" _. X4 a2 J* t2 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:12 , Processed in 0.063323 second(s), 23 queries .

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