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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
3 b% d6 h  d% {- [
3 x) V1 s0 S. \' q" e# H在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 }" Z; p  d& B- B( k9 a
1 o, x5 K7 C7 P& j0 L" {
6 z6 J' A- O6 V2 a6 z' ~9 m0 f* x7 p- {) |2 |: ^
我们来详细的讲解一下PHP中的命名空间:
* G' n3 S0 W, Q  i5 k$ M# m
2 y. n6 i( S7 @. m/ \7 w语法:namespac_e 空间名\空间名;
0 ?+ R  C  a6 j8 g( W: h1 C% a$ g! @  w9 b2 c/ F: O. S8 ?
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 C1 J+ I6 ?+ S* r" J
! Q" h7 I4 x% H6 S
----------------------------------------------------------------------------
9 {! K/ S8 C0 S% C
1 T( J2 J/ K! G0 [<php
8 s, |" G& d1 @- N. ]$ `, d! ]5 u  I
namespoc_e AA;
$ u' w+ N( G7 ?functio_n showInfo(){9 ^9 o3 i4 G. N$ @5 i% G
    echo __METHOD__,'<br/>';3 n2 u3 Q' I. j0 p1 u0 X3 h! F) s
}2 k* J6 N2 @' U0 J' A  L3 ?) T2 g
showinfo();
& K5 s, ^- Z# F- J" e, m: B9 ~; a7 l8 T# g6 k
namespoc_e AA\BB;
: h: F+ ?. R! ~& B' o. Y- `8 i) J2 t6 a, B" d2 r/ T% i" C
functio_n showInfo(){' l& P0 d3 v& t3 \# r* e
    echo __METHOD__,'<br/>';
4 E! T& t( x7 P( J8 U! @0 _! M2 s}- W! _; g" \6 Y' {! s; r# D
//showInfo();
! {! a' V) W& j$ z: Y----------------------------------------------------------------------------
( D8 C" J( N1 c% u7 |5 o6 U1 h2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
% e) X) l8 v& K. e( U8 Q% p% a3 |0 D7 f* N! @
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。1 v) P' @# Q' h: p+ V' }, G
+ D: W" r; t" d
----------------------------------------------------------------------------+ \/ a# p( a& w: ^" w+ ~. H' b

  B* Y3 _% C" f<php
4 n5 H) R, k5 [% F% `namespoc_e AA\BB;
3 d( ~9 ~5 F; h; u8 f% Afunctio_n showInfo(){
, g  d; @8 q# o8 K7 F6 Z4 i. u    echo __METHOD__,'<br/>';, ?0 @+ B  K* k( ?0 m. ]
}) v1 T+ Y' f2 a8 @
namespoc_e CC;
5 g# y+ H8 y$ i' Y% @functio_n showInfo(){
2 {/ T" C+ P$ L* t: D% }    echo __METHOD__,'<br/>';
' Q* P+ P, N* N2 _}
3 C) e2 c! d! |namespoc_e AA;- @% D- c5 _" \) ^
functio_n showInfo(){8 y8 X/ @; Q# r! V* }' h8 k6 B
    echo __METHOD__,'<br/>';
' S  E2 [! I% t% C' E}
, [! A0 U8 [' o9 Y0 ~" Z//非限定访问:用于访问当前空间中的成员# T3 E8 V! B! U4 O7 I4 J
showInfo();
) t0 V8 j; |: m, H# K2 A//限定访问:只能访问当前所在的空间的子空间中的成员3 F4 ^# o& E0 b3 m4 {
BB\showInfo();: q; ?; L6 O/ j" I: K4 x/ w3 x" _$ u
//完全限定:可以访问其它所有的空间的成员
* t# q! v4 J, `' S\CC\showInfo();4 N9 c+ y3 D) k7 [2 h
↑根空间标识符
* \: T0 i% R3 a4 [+ H----------------------------------------------------------------------------
- L+ [  w  V( T# T但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:9 c9 g! t" f( m5 S; F) Z
) J: t. ~% N+ E" n2 k9 W+ K. G
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
0 k/ m; ?" P) z9 [/ j  R
. t  q& b8 ~% @8 B0 g$ H/ M) e代码示例如下:& Y* w7 K3 e2 @" m4 s0 m

/ ?6 B9 `1 X8 h. u  ~; [----------------------------------------------------------------------------
5 Q2 ]* K% z1 V% `. S  S* U2 c4 j! j2 N/ `
: N5 r8 W- c5 `8 i
04inc.php4 o. I- z  x2 \
<php, d( \( g3 E4 r2 X5 b6 F1 C
0 }  z$ h0 E; D( B, T2 Q) C; f
namespoc_e Core;
$ N; ^/ ~) \: }4 O% W7 m% ]include '05ou.php';( {/ S( L! F: d- s
new \AdminController();
, p' ~+ I9 R+ S( {& a0 NshowInfo();
5 A3 `+ ?; z6 u. x. z: |! c7 o- C9 M9 j# G8 ]; n# C/ G
echo P;
" m- F1 h; B, c+ a//根空间中的成员,只要类的访问必须加‘/’1 k8 @  C% r( H* `" ]
----------------------------------------------------------------------------2 L% B! f8 S' c- O- J
; K7 D" S3 s, e  x2 d0 K! G
05ou.php9 [2 d1 u% l4 o9 Q! |0 \
<php  W- L' @" L7 T- a1 H1 B5 T; S
const P=5;% C- D8 V) I9 ?9 _8 C4 X

  o" A4 J) h8 q& |( g9 X+ Dfunctio_n showinfo(){$ Z! ]" ]& O4 z
    echo __METHOD__,'<br/>';8 R. E3 m" M3 {7 ~5 H8 r+ F
}
) L! t& A, h+ |$ B5 V( A3 _4 t
6 N3 d; F6 }. k1 J, x0 h7 mclas_s AdminController{
# c7 z$ ~+ v: ~  ?# |4 e    public functio_n __construct(){
7 W6 s/ X( K9 B        echo __METHOD__,'<br/>';# r2 Z- G! r' X
    }# {2 B0 f1 w7 @2 c( A2 @
}3 M7 H5 p& Y$ N- \( s: b5 f, |
) p4 Y, `) O1 @0 R) C% E! c1 X
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. E4 G- C0 ~: H
----------------------------------------------------------------------------
/ U! k+ u9 `( z8 j: |/ i04inc.php3 Z, m  F% n. g' ?2 I/ J
<php
1 k3 g( Q' C* R* R5 {) m: i* Y8 z. h3 O8 l6 t6 q: }
namespoc_e Core;4 U* L% q/ D& ]5 u6 g2 v
include '05ou.php';0 p# N6 u: N, R! {% l3 s; a
functio_n showinfo(){
8 r. z6 j3 [7 A7 O0 ~    echo __METHOD__,'<br/>';" a" d, S3 x6 y
}
$ [: X: d0 W$ c  [4 W3 ], ?+ G' l5 Z) |1 I
new \Controller\AdminController;7 J9 B8 |; H8 r; P
----------------------------------------------------------------------------4 @; N4 \( f" p6 \  O
05ou.php- y" H1 h( u  z! u) ~) ]
<php9 ~( y: Q7 Y! ~" t) D
namespoc_e Controller;
5 z# S7 I9 R1 C) X' h2 L1 f/ t* G4 ]9 Q: v. f
clas_s AdminController{' Q5 B, q3 L& V6 z1 ?
        public functio_n __construct(){' o4 ?! x$ e$ ?. m" ~6 P- k3 k. {$ W
                echo __METHOD__,'<br/>';
# ~8 K$ V- f/ O" z3 [9 w! Y) @    }) e* ^! ]' S! s# `: g- `. U( U& r
}# @" x1 R3 w) ^* r
----------------------------------------------------------------------------( h/ a. o6 [& P+ K  M0 C7 `$ ]" Q
, ~8 ?: E  u. f* \1 M, {+ Z. T! W
4.引入空间成员:3 O3 ^+ t# ^& Q) K! x. L( x4 ?9 Z

- V% M  o0 E& p9 z) D1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。  v+ m% i" K1 O  e; r9 G
. l) X, Q- R5 l# W, W. {) @
----------------------------------------------------------------------------
1 p. R- i; A7 a- q! `  I
* P, J% P9 a1 j! M04inc.php- g# x" S" t) ~, M- L1 d0 c/ R
<php
8 R# C6 x( N$ T3 J5 k- j6 onamespoc_e Core;
6 d4 G% ~/ M! |. ^6 tuse Admin\Controller as con;
3 N/ z3 D: T: G8 h, @8 O
* o. [5 I, g& }! `% `9 oinclude '05ou.php';
4 v0 [; x7 z* r1 B5 @( Q. d+ ?8 w2 i& g! V2 I
new con\AdminController();  r3 |! {/ _# y$ @5 o1 ^
----------------------------------------------------------------------------
' ~: c% h; f+ _; D3 e! _4 l05ou.php+ Z3 F5 n/ w. B* l  y2 g
<php
- X  g3 a& [7 y% B+ N9 u0 k7 a' xnamespoc_e Admin\Controller;! o% Z& P* E+ ]* O7 O* [

; ]3 M$ i% }. V0 T4 t* kclas_s AdminController{
9 m+ |% @  q- j1 _* v* t    public functio_n __construct(){9 h" E# U* T3 S# M5 E7 b1 C5 }
        echo __METHOD__,'<br/>';
5 h4 N7 P$ X" v3 D5 k    }
- V- b* S$ v/ h2 |% x  c6 J( v}
, B; t2 ]1 r" z' i5 L----------------------------------------------------------------------------
6 P5 q$ L4 h6 j. G/ n# h! T9 ~2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。) H& c( t5 O5 U. N( @
" Y3 U) h) H* f0 ]& G' ~
----------------------------------------------------------------------------9 ^$ h! O4 w9 z1 U, B7 Z
2 O- t0 b* C$ W, N
04inc.php
! `" F' ]' e4 h6 e<php( E) ?. G0 F4 d. v: i
//引入空间成员类
  ^+ Y( y0 u4 _- j! o7 S1 k  Y) M( v
namespoc_e Core;+ r% `% |9 h# m+ M2 @; z; i# G
use Admin\Controller\AdminController;9 B) F9 n3 t/ Y9 O3 j, f- U# b5 b
include '05ou.php';' Z5 n, }& o* L& {6 J! X$ u5 W
$ k1 Y9 C% f$ ~& D4 f% Z
new AdminController();& T: Q6 j& m) ?( ^8 c( e. @! ]
----------------------------------------------------------------------------' f- P3 @: {4 T2 S0 m; w9 v
05ou.php% u8 F2 e9 u* L
<php
7 o$ @2 r% ~2 @# Xnamespoc_e Admin\Controller;! `: {. x( }1 m- X; ]$ x
7 i8 i4 E! G0 D. w4 T
clas_s AdminController{
) C% H! _  L* {! E2 _  [    public functio_n __construct(){6 K  O  O+ @. ]4 P, j
        echo __METHOD__,'<br/>';
6 }( i, K0 |: P2 l4 l1 _0 ~) g6 N    }
( I% N% C; n' {! x9 j$ q% @) |}1 C5 a% L0 M+ M% V
----------------------------------------------------------------------------
2 P: `) W9 r0 i1 K. O. G5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。- y& p+ F6 \- V3 D" C
/ _! O$ i  H0 S5 s9 c8 H8 i$ u
( J  q( x2 D& ~+ L" s& c+ Q
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。; x+ P/ _: Y6 `; S$ {
% O& P8 U- B# w. z: W& [( V
" p5 J% K5 J9 O$ ~' y; I) Y1 s

1 G/ M4 S# N2 s, K
5 R( X- a* C) H! }/ q" C# @7 Z8 C" G4 r% b3 D8 Q  Y. b( A2 Z

! Y! V- m$ ~) u" u+ I. P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 08:19 , Processed in 0.061981 second(s), 22 queries .

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