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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1986|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:( y7 t6 O  [2 k+ m2 H/ H5 y

" E* H7 I: _' l在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
# Q8 ~+ V& b. i) v) ?! S6 W5 r% x3 ]- _1 ?3 y
20181201105307520[3].png 3 x# Z3 b- @7 c

0 I. e1 o0 \. H# l' \我们来详细的讲解一下PHP中的命名空间:
, O# L6 v- y4 \0 d- n* e( n
- W; g% G6 m0 R5 Z语法:namespac_e 空间名\空间名;
3 M7 M7 p$ G3 s) i: l1 v
# v5 F  `+ s% v1 l0 g+ v说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" c4 b7 n' b! B8 w! k$ }& r& Q& Q# C
----------------------------------------------------------------------------
0 X, c$ @8 v" O: I
7 N( v. y1 |$ {' Y  t3 Y: f<php6 W) @9 x4 W8 e$ J! c

7 A8 X8 V4 d5 V7 c3 g; w% H! A. anamespoc_e AA;  }, L6 G2 X; }* v3 X
functio_n showInfo(){
' A7 @9 `8 s0 C, v# r5 B& o: B/ p    echo __METHOD__,'<br/>';  ?/ A: _3 R, V; H# E: i
}# M8 G. N' y3 z3 h
showinfo();. R9 L0 k4 D* c  u2 C
! h5 ^1 U' v/ h2 U
namespoc_e AA\BB;  I- |4 d8 t8 I# y- L: o' E
, K9 A' l9 m4 q9 P, B4 G' X/ V  X
functio_n showInfo(){9 R+ z2 b! @6 N7 x
    echo __METHOD__,'<br/>';# _* ?) x* p4 A9 Y0 E
}, M4 J+ ~4 G' m2 b
//showInfo();
' g9 z  g( o9 N; T0 R2 y4 M----------------------------------------------------------------------------
# W! d# ~* T7 `8 h1 n% I/ Q! v) [2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
% F- G8 P! j! k0 |  P" g. [% m% v6 J% t8 Y' c! B* B) ~' W3 |
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。  K6 p$ O/ V( H" m$ M" `2 {6 l" |; T
3 g; F  H' Y1 \) B9 l; r: Y
----------------------------------------------------------------------------
* A0 k( e5 u& X- \
$ ^6 t/ S- _+ e/ K& }<php
) C* k# ]' G. g' y4 [namespoc_e AA\BB;
% r: s! |% J) Kfunctio_n showInfo(){6 H7 ^1 ^. @/ A
    echo __METHOD__,'<br/>';
; w! Z$ B- F' _# g5 w5 E: I8 e/ T}
3 l3 @3 G& ?8 Bnamespoc_e CC;
- d$ s$ B5 u0 d, D$ Z  Yfunctio_n showInfo(){* Y+ S8 T  l: F# `% K: w" o7 W: v
    echo __METHOD__,'<br/>';
- l6 ]# @% k+ Z0 r2 k$ k}( j. X& O9 _2 \0 }6 U" P
namespoc_e AA;
1 T; C9 l0 _9 t) jfunctio_n showInfo(){. w% R* o% q7 }' t
    echo __METHOD__,'<br/>';& s" d; L2 E. M- q! j, R
}
8 V& u& O- I+ K% N; }- a//非限定访问:用于访问当前空间中的成员3 h$ p) _& \" |# p- X
showInfo();
+ u+ L) p4 J$ A4 U6 m: a//限定访问:只能访问当前所在的空间的子空间中的成员2 R' i3 S0 a- }" \5 Z
BB\showInfo();* I( S: a. D  R3 K& t4 X& E
//完全限定:可以访问其它所有的空间的成员
5 o& a# ~. f6 q; G# ]8 m\CC\showInfo();* u, v' X3 L$ d, s
↑根空间标识符
4 O( f9 R3 x! S/ M8 Y! [----------------------------------------------------------------------------
# T$ g4 L$ x. O但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:, m7 ]% K9 _+ P0 ~. g
" q' ^7 @4 H) v! A4 q0 i. D  D8 O/ L
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
& A/ X8 x) A$ F. R1 T5 f) z+ J& a+ ]& w+ X% T' }  Q0 M
代码示例如下:
$ y9 }1 T) }! ^0 ~2 ?$ e
$ j' x. f7 y2 ^' {----------------------------------------------------------------------------
; X) ^& C- J) [- \  g* V8 Q# {% P, X+ v0 z$ t

) a( N8 r1 `/ b2 ]3 E7 n! h04inc.php* o' C, D& K7 A. G" z8 L1 p
<php
/ J1 o, |9 a' e6 g
/ G+ k! i% ]: F6 o8 l& v/ w+ \namespoc_e Core;9 u' x) u7 ?, n; X1 R6 S2 Y! F7 A
include '05ou.php';
" k1 M  y8 U+ C% S' @, K$ Ynew \AdminController();3 U. D1 W5 F* H' ^3 v9 u$ V* R
showInfo();
* a% r5 D* j/ [9 |
& f9 j* Z; g& p" B0 ?echo P;
7 A( h- v* p. b, o/ g$ _//根空间中的成员,只要类的访问必须加‘/’6 U# j2 T. q1 L% }3 |* K  G2 j8 N( r
----------------------------------------------------------------------------
. _- o+ G# Q# A1 X% Z( p( r% s0 O, t2 b6 K7 {
05ou.php
  C+ E1 I+ P$ K( Q8 O/ r( @: f<php
" Z. {" j' B/ ~const P=5;1 D: k; I  A: ^$ o3 i9 ^% a% f
" w4 a1 J+ b! Z$ N4 ?, A+ ]
functio_n showinfo(){* v& F! _1 y" s! x# ^
    echo __METHOD__,'<br/>';
% |" T" e! _1 I& s. N8 ?}/ p: E" t% j$ o& y! B  ^0 X, N( _

) H8 H- z1 U0 P( \9 F# Zclas_s AdminController{
7 ^6 ^1 t9 K7 m) }* e    public functio_n __construct(){
8 T# q" d, B) {) n+ i7 [        echo __METHOD__,'<br/>';! _* }( a( \% P' [( V
    }
2 B# d2 F0 o/ ]) L4 n+ K0 f; U}4 k0 c+ ?" A6 V: N% R" D9 H
5 c& K- n4 f8 B2 `9 u/ C
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。- [# f4 _3 M0 e' X2 W9 ~
----------------------------------------------------------------------------
/ R  |4 A/ E: }+ u$ B; ^+ z04inc.php0 l& o$ s0 h7 M- `; V/ w0 \
<php
3 l* ^' x$ J& q2 a
' ~$ Y) P: P3 \' @" Anamespoc_e Core;
9 B( a6 v. N" X+ ]. ]) [0 E  ninclude '05ou.php';, i: Q( E' v2 S, k' @1 r
functio_n showinfo(){
/ y1 v! L: ]! y, X; y* x    echo __METHOD__,'<br/>';
+ A" L- m" X: z}
3 S4 n4 O+ Y: R4 Y( ?! e. G; }( M1 B' j3 B" P6 l8 d- @
new \Controller\AdminController;
8 ^  V' |& H) w1 n: I# I" X----------------------------------------------------------------------------
( O0 P  I* H5 _! ]05ou.php
/ l& s9 J8 Y  ?! t$ {2 c$ h  n<php" b) x4 m& |+ a% H& E3 Q3 d
namespoc_e Controller;9 `! `/ N1 ?7 L" R: g& e
! o& E! Z1 G; b8 X
clas_s AdminController{- K7 |; Q8 G% J+ D
        public functio_n __construct(){
1 i9 ]* y' Z' Z3 C% a                echo __METHOD__,'<br/>';. T# [% m9 e2 z+ W- `0 r
    }8 V+ k$ d  b3 j
}
/ ~- ]8 ]1 t1 o! s! U. _----------------------------------------------------------------------------
9 B! A; O" h2 J  C
: H( Y# c4 m3 R( D$ F$ P4.引入空间成员:
1 [1 _. z: y) i" r: `
! b8 z& U5 H. i( i  E8 Y' z1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。5 [8 s6 j( M9 m9 b' ?7 m. H8 T

  a4 A& z5 ?  E; X: w----------------------------------------------------------------------------# y1 ~( ?) y- J" b; I9 N. m0 m
" }4 z4 W& a8 l8 \. L
04inc.php) P7 @6 i  e* t
<php6 A6 l+ G; N( t/ L0 ]! y9 O
namespoc_e Core;# P+ D6 J2 I3 q* i" j4 H$ M, T
use Admin\Controller as con;0 ?  k; O2 L+ ]  p
- P+ A5 ~) ?: N. s! r
include '05ou.php';+ X2 f; n0 L# b& b1 B$ n

( y4 J+ J  S: H/ D, z' c  U' znew con\AdminController();
" G4 G# F: M' B- G+ _  \) P& Q----------------------------------------------------------------------------
/ `4 A8 U, B# b  @/ m1 @) M05ou.php
/ O8 m, F! u0 E2 @  b$ _<php5 a3 }0 {2 M$ l- c+ q
namespoc_e Admin\Controller;
1 f. x; G8 o3 _: J
0 o5 c; X7 x0 w/ H5 V1 Cclas_s AdminController{' ^$ o1 w; L& \7 V
    public functio_n __construct(){
% z5 o9 d3 Q2 B+ V) Q6 ^        echo __METHOD__,'<br/>';0 [: {' M- M2 v6 h6 Z1 ~
    }
1 r: e" R& ?/ H/ F. e) c7 l, T5 U}  I  V: l" M2 }, |7 {- y
----------------------------------------------------------------------------8 D1 z- ~  y$ ?% ^, c4 u4 r
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
  e3 k; R- d" N0 O1 w/ X; \5 b0 S+ I0 b
----------------------------------------------------------------------------
9 j! J9 O* F) U6 b) H* F7 m: X; W1 W* n) x# `
04inc.php
9 T' P9 ?( W1 E/ T4 c<php4 f6 r# f6 F0 j0 u) y7 z; j
//引入空间成员类
/ `& Y0 M) J  ~: C9 d. O$ R( M/ ]$ k0 p/ l: |& g  H$ R& ?
namespoc_e Core;
4 m5 d% m# i, a" M6 quse Admin\Controller\AdminController;
/ m$ R$ r* J+ ^2 G  t2 ?" K  o: T0 ninclude '05ou.php';/ g3 ]( r9 P' D6 T6 ]. ]

& k8 u& ]$ ^* D5 \new AdminController();
& q2 }+ L/ l, Y( |' B' {----------------------------------------------------------------------------
3 I2 e$ j2 X/ e7 I05ou.php
6 d+ d; k5 n; c3 r3 k<php
/ \' m" o7 S! t2 d$ p8 A; mnamespoc_e Admin\Controller;8 m/ d) f( k4 \0 J* K' t+ Y
! N- B! w& Z' Z4 S" Z, \
clas_s AdminController{$ U3 u; ]: u* _( c" O. n
    public functio_n __construct(){- h, j2 u$ E8 ~! y) t* u9 M. [
        echo __METHOD__,'<br/>';( S; w) ~+ I3 t+ V! H) R2 T/ G
    }  s4 P8 e; I: b  z. s, M& ]6 V
}1 U" c* H1 m* }3 f' k
----------------------------------------------------------------------------
( O' @7 ]5 y& |5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。& Z* I3 ?' A1 F# v* @$ _" |  U  S

2 E0 G1 S+ L6 A+ v
" Z8 Z( _2 u. n# H$ a这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' @6 e+ j8 s5 J+ a" p0 e

4 q1 M" _$ o5 [6 a! _6 d4 p4 g, E
- S' M6 M# D. p' B; d- T2 J2 j( _1 O) L9 ~2 h

2 ^, `' _9 ?/ d6 |
/ t. z( `, L8 w& E) z0 V3 |$ E
" ?$ w) Y# _4 V* _5 V& w, U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2021-9-24 17:36 , Processed in 0.198835 second(s), 23 queries .

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