关灯
开启左侧

[研究发现] php 类自动载入的方法

[复制链接]
swmozowtfl 发表于 2015-7-28 11:32:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
  在php5之前,各个php框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。  当然,php5之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 我们来详细探讨下吧。
( ~) K; F3 w( D3 S  php 类自动载入方法" Y9 D4 `$ @6 y& v- [  E
  ?, z5 M0 l4 c6 K2 Y
            1
0 q7 N, |: ]8 P& t9 I            2
9 Y9 J2 J$ {$ @! M( t3 O- ~0 a& `            3$ ?, Q, O' M0 `2 @9 j/ }
            49 i# _4 G4 E& _. J. ?+ G, R9 u
            5' c, u7 i* Z* o' Y4 u( L+ A
            6
. e( c+ c  x+ L# H7 c; \; p) `            7
! a$ z7 D9 _) ?( W0 J            8
7 b) p, w6 Z6 S, ^" o& ?+ ^            96 R, o9 c8 [2 f
            10
( x, y# t7 m( A) H2 h# a  y: ?( Y            119 g  f7 u$ r2 W3 x! n0 v" i
            12" l; Q6 F- V/ e$ Y4 p- _/ B3 ?
            13
' {* F2 \8 n: Y& R, g6 q            14
! G" ]: Q  Q; t% P. l8 F            15' N9 Y' o6 d8 L3 W5 Q& r" F" ~* Q7 e
            16
1 c/ I5 l8 H/ r8 B+ R            17
9 G6 ~9 S2 l7 n' B: o            185 @5 I3 X8 w* S' f
            19' D0 W7 |( R+ {( S2 Q5 N
            204 E# g* }* j- ~' q' ~- p
            21( Y; \8 L. x3 V( |+ {
            22
- k% Y! x0 L' l) w            23
/ ^' J# Z( {* ^1 P- J! f4 N            24
! d. z. ]$ ^8 K- |$ {  w1 {            25
2 p% }& T! {8 D: P            26% a4 d1 P8 n4 M; H, ?7 K
            27# U. i) \& a. r* }. ?
            28: U6 K0 o% W% L% D/ M
            29
  W1 p; P- u9 |  P" {            308 u- S5 @* ]& c# ]0 e% m$ s  ~4 S
            31' O  X; T* c& G7 K) _. c, Z
            32
. `3 {* l2 S8 g% z) p            33% V  ^2 u) K# }. N% [0 |: P
            34( V! a( M  `7 O8 ~7 P7 @8 V+ x6 d$ \
            35
) G' K1 a6 S; I9 C            36
0 w1 l" x) ~) V* |. U3 S" ^            37
; j0 }4 Q: n+ s9 |* e% z            38
' W( v1 W+ U3 A; E% a            392 Y8 O9 i+ e! d1 z" q
            40
4 N& |; q$ }1 q            410 R: r! e& {6 ~7 @9 ]
            42
7 e3 U4 F! o, {( c  q            43# }" G$ C8 a+ h! k1 o/ s3 n
            44/ ?" h! \: o; E1 _4 q
            45; p9 m& n% v- I+ n
            46
# [) ~/ G3 }3 C' ?3 Y% p( P0 r, M; \6 ~            47
& s1 `3 q2 V0 E, J& `$ R            48
. b1 H  v* d* K            490 C. k- ]6 F$ L+ ?
            50) c9 F/ {  C6 K# v% ~/ ?
            514 H, \7 J% j& p8 ~  N) B
            52
" z4 V; c4 o/ B" j4 u3 @            53
  ], q+ L$ l: M7 C- t            54
5 H- k( n# m$ ?8 o' h; n            55
: A0 h% a6 n( `# a            56, y# r% U% \/ s* k% I
            
                        <?php0 L" w, I7 R2 l6 }9 y. t
            class inload
/ G! l/ `+ Q4 P4 s6 U, k            {3 S9 n/ F/ O9 M
            /**
7 o' @  a+ J5 h            * 类自动载入,不需要由开发者调用
6 e# Z  S) t' t( f            *9 C% L9 \* x2 _% _6 S6 W
            * @param string $class 类文件7 g2 _1 J" ^: G7 _! a5 T+ Y
            */
4 @3 N" {  t& c2 p, i+ ]            private function autoload( $class )
% T5 H3 A0 J" G+ [            {
* l6 P, D1 f3 d0 i            if(  empty($class) )
! B. o) X6 r1 C3 w0 j( c# B( E            {
  q; F+ V( h; [# q+ h7 j+ m$ Q$ Z            throw new qexception('加载文件不存在'.$class);
3 R: |: M" r- O% T7 p1 J$ x            }3 p. g7 l  V* J5 x& g; {
            else% e5 {* J( x. Z
            {
" T1 K  I" t1 V  E. p& q/ }8 v" G            require _spring_.'/_core/springmap.php';  //框架地图, T. H( \' i! S9 `' U
            if(!  file_exists(  $source[$class]['file'] ) )2 A% _0 ~6 n: D. d8 h  W2 K- i
            {
/ g/ ~/ N9 n( w& P, _            throw new qexception('加载文件不存在'.$class);4 W0 R" A& P' J
            }  y; X/ F8 v( O& k$ @$ B
            require $source[$class]['file'];& r6 y3 k  p8 e! g. w. p
            }
) K" K! B$ R& t  n* @# i# d  Y5 W            }
; |9 F# A; \7 _' \0 S6 ]- J7 N* _  _            
- [( H2 ~+ y1 `1 M+ X9 E& F            /**6 p* G* h) @+ i" c' I$ }6 N5 A
            * 注册或取消注册一个自动类载入方法
0 l  h. ?1 p, }4 k) B5 n5 Y            *5 s, q% _5 `% o% J; q
            * 该方法参考 zend framework2 Q6 Q# Y4 M) l% l& p/ r$ q9 z) K
            *
( F9 J5 L0 `! f$ M, C$ c. P1 D            * @param string $class 提供自动载入服务的类5 n. r; {5 C7 M# f# I9 e# E
            * @param boolean $enabled 启用或禁用该服务  a+ P; z3 {* m5 i& i
            */
, Z" ^, v1 _0 \- ^) ~0 U            private function registerautoload($class = 'interpreter'  , $enabled = true)" \6 e2 c$ d0 M# C4 M
            {0 [5 F, s2 T$ _; Y# {
            if (!function_exists('spl_autoload_register'))
3 m+ L  @$ @% G, ^) i1 q# k            {8 g* N( {  P' M5 a# x6 `! E0 |. b
            throw new qexception('spl_autoload 不存在这个php的安装');
8 q4 Y2 J* e8 f7 o8 b" S$ M0 y            }
8 h; B5 Q8 Q7 S7 ?9 r) w5 l            if ($enabled  === true)9 v+ {. R; @: Q
            {
( o! W" W: C8 }! M( |            spl_autoload_register(array($class, 'autoload'));
$ |* u1 R8 Q' @; H8 J            }0 R6 l1 t& k- P( r
            else
' K, D4 j/ L" O- Z            {
5 `: o2 H- s! |; z3 h8 I            spl_autoload_unregister(array($class, 'autoload'));2 p4 r. C; ]+ D- W3 T
            }! S& U0 X7 M8 m' V4 v1 k* t
            }
% R0 d- `/ n( J0 ?5 Z3 {             4 ~: a; i" C% t: f/ V
            /**
: k. |# L' h; Q$ n( Y2 O            * 析构函数
2 R" |+ \/ s4 i+ n            */
8 V" c6 i$ d% U+ M0 m            public function __destruct()
; U1 ~4 K6 N! f& v+ H9 a- ], r* j            {
+ V# ^9 Z5 h6 t: I& g  V) }/ f            self::registerautoload('interpreter' , false);
0 [# B$ M4 h8 ?+ M& [            }
! b  Q4 W* O6 ]/ x! E1 J" m" R            
) H5 n; j* E7 V6 J5 F/ J            
  以上所述就是本文的全部内容了,希望大家能够喜欢。
# P9 v  f8 d. H% I  P% z更多网络编程信息请查看: 网络编程
 

精彩评论10

正序浏览
GoodyFouppy 发表于 2016-1-30 15:00:55 | 显示全部楼层
 
本人在此留言均为网络上复制,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能。并不代表本人局部或全部同意、支持或者反对楼主观点。
 
bqtklouu 发表于 2016-1-30 15:00:29 | 显示全部楼层
 
做为老人!在吧里我都懒的都不想说话!送完经验我就走!
 
wwdu926a 发表于 2016-1-30 15:00:51 | 显示全部楼层
 
我在顶贴~!~
 
Acropozelan 发表于 2016-1-30 15:01:32 | 显示全部楼层
 
cd:遮~~~~~~
 
bqtklouu 发表于 2016-1-30 15:01:12 | 显示全部楼层
 
其实今天baidu 又 抽风了
 
Mqokjdvq 发表于 2016-3-20 12:42:22 | 显示全部楼层
 
楼主,你要继续努力啊!你是bbs的希望啊!你是网络文学的希望啊!你是整个网络界的希望文学界的希望啊!你是整个人类的希望啊!你是整个太阳系的希望啊!你是整个异次元空间的希望啊!
 
Mqokjdvq 发表于 2016-3-20 12:42:58 | 显示全部楼层
 
我刚来~~~嘿嘿~~此声明最终解释权归本人所有。
 
buingeEvineus 发表于 2016-3-20 12:42:52 | 显示全部楼层
 
综上所述,恳请各位官员请勿动用武装力量请勿跨村、跨镇、跨市、跨省、跨国、跨洲、跨星球、跨银河系追捕。确因不抓不足以平民愤,或不抓就领不到薪水养家户口的公职人员,建议携带工作证
 
tohme 发表于 2016-3-20 12:42:01 | 显示全部楼层
 
相比他连说拜拜的 想法都没了 哈哈
 
wwzcdenleclv 发表于 2016-3-20 12:41:35 | 显示全部楼层
 
还呕像.....
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


0关注

1粉丝

2503帖子

热门图文
热门帖子
排行榜
作者专栏

关注我们:微信订阅号

官方微信

APP下载

全国服务Q Q:

956130084

中国·湖北

Email:956130084@qq.com

Copyright   ©2015-2022  站长技术交流论坛|互联网技术交流平台Powered by©Discuz!技术支持:得知网络  

鄂公网安备 42018502006730号

  ( 鄂ICP备15006301号-5 )