Map-based autoloader across php and phar resources

⌈⌋ branch:  Canonic Autoloader


Hex Artifact Content

Artifact 0c06015feca4b117cda5a440b4bf0c7c2f4afe4b:

  • File stub.php — part of check-in [18e74838b1] at 2015-01-22 21:58:36 on branch trunk — Build in trigger script for DPKG and RPM (untested). (user: mario size: 8146)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 61 70 69  <?php./**. * api
0010: 3a 20 70 68 70 0a 20 2a 20 69 64 3a 20 73 68 61  : php. * id: sha
0020: 72 65 64 0a 20 2a 20 74 69 74 6c 65 3a 20 43 61  red. * title: Ca
0030: 6e 6f 6e 69 63 20 41 75 74 6f 6c 6f 61 64 65 72  nonic Autoloader
0040: 20 2f 20 73 68 61 72 65 64 2e 70 68 61 72 0a 20   / shared.phar. 
0050: 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20 4d  * description: M
0060: 61 70 2d 62 61 73 65 64 20 61 75 74 6f 6c 6f 61  ap-based autoloa
0070: 64 65 72 20 61 63 72 6f 73 73 20 2e 70 68 70 20  der across .php 
0080: 61 6e 64 20 2e 70 68 61 72 20 72 65 73 6f 75 72  and .phar resour
0090: 63 65 73 2e 0a 20 2a 20 76 65 72 73 69 6f 6e 3a  ces.. * version:
00a0: 20 30 2e 33 2e 34 2d 33 31 0a 20 2a 20 64 65 70   0.3.4-31. * dep
00b0: 65 6e 64 73 3a 20 70 68 70 3a 70 68 61 72 20 7c  ends: php:phar |
00c0: 20 70 68 70 20 28 3e 3d 20 35 2e 33 29 0a 20 2a   php (>= 5.3). *
00d0: 20 63 61 74 65 67 6f 72 79 3a 20 63 6c 69 0a 20   category: cli. 
00e0: 2a 20 6c 69 63 65 6e 73 65 3a 20 50 75 62 6c 69  * license: Publi
00f0: 63 20 44 6f 6d 61 69 6e 0a 20 2a 20 75 72 6c 3a  c Domain. * url:
0100: 20 68 74 74 70 73 3a 2f 2f 66 6f 73 73 69 6c 2e   https://fossil.
0110: 69 6e 63 6c 75 64 65 2d 6f 6e 63 65 2e 6f 72 67  include-once.org
0120: 2f 63 61 6e 6f 6e 69 63 5f 61 75 74 6f 6c 6f 61  /canonic_autoloa
0130: 64 65 72 2f 0a 20 2a 20 61 75 74 68 6f 72 3a 20  der/. * author: 
0140: 6d 61 72 69 6f 23 69 6e 63 6c 75 64 65 2d 6f 6e  mario#include-on
0150: 63 65 3a 6f 72 67 0a 20 2a 20 61 72 63 68 69 74  ce:org. * archit
0160: 65 63 74 75 72 65 3a 20 61 6c 6c 0a 20 2a 20 6d  ecture: all. * m
0170: 61 69 6e 3a 20 2e 70 68 61 72 2f 73 74 75 62 2e  ain: .phar/stub.
0180: 70 68 70 0a 20 2a 20 70 61 63 6b 3a 20 73 74 75  php. * pack: stu
0190: 62 2e 70 68 70 3d 2c 20 61 75 74 6f 6c 6f 61 64  b.php=, autoload
01a0: 2e 75 70 64 61 74 65 2e 70 68 70 2c 20 61 75 74  .update.php, aut
01b0: 6f 6c 6f 61 64 2e 6d 61 70 2e 70 68 70 0a 20 2a  oload.map.php. *
01c0: 0a 20 2a 0a 20 2a 20 53 65 6c 66 2d 63 6f 6e 74  . *. * Self-cont
01d0: 61 69 6e 65 64 20 61 75 74 6f 6c 6f 61 64 65 72  ained autoloader
01e0: 20 77 68 69 63 68 20 70 72 6f 76 69 64 65 73 20   which provides 
01f0: 2e 70 68 70 20 61 6e 64 20 2e 70 68 61 72 20 63  .php and .phar c
0200: 6c 61 73 73 0a 20 2a 20 6c 6f 61 64 69 6e 67 20  lass. * loading 
0210: 62 61 73 65 64 20 6f 6e 20 61 20 6d 61 70 2e 0a  based on a map..
0220: 20 2a 0a 20 2a 20 55 73 61 62 6c 65 20 66 6f 72   *. * Usable for
0230: 20 70 65 72 2d 70 72 6f 6a 65 63 74 20 63 6c 61   per-project cla
0240: 73 73 70 61 74 68 20 61 6e 64 20 2f 75 73 72 2f  sspath and /usr/
0250: 73 68 61 72 65 2f 70 68 70 20 68 61 6e 64 6c 69  share/php handli
0260: 6e 67 2e 0a 20 2a 20 49 74 27 73 20 69 6e 64 69  ng.. * It's indi
0270: 66 66 65 72 65 6e 74 20 74 6f 20 50 53 52 2d 30  fferent to PSR-0
0280: 2f 50 53 52 2d 34 20 6f 72 20 63 75 73 74 6f 6d  /PSR-4 or custom
0290: 20 64 69 72 65 63 74 6f 72 79 20 73 63 68 65 6d   directory schem
02a0: 65 73 2e 0a 20 2a 20 42 65 63 61 75 73 65 20 6f  es.. * Because o
02b0: 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6d  f the filename m
02c0: 61 70 2c 20 69 64 65 6e 74 69 66 69 65 72 20 6e  ap, identifier n
02d0: 61 6d 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ames are handled
02e0: 20 69 6e 0a 20 2a 20 63 6f 6d 70 6c 69 61 6e 63   in. * complianc
02f0: 65 20 74 6f 20 50 48 50 20 73 65 6d 61 6e 74 69  e to PHP semanti
0300: 63 73 20 28 75 6e 6c 69 6b 65 20 50 53 52 2d 78  cs (unlike PSR-x
0310: 29 3b 20 61 6e 64 20 73 74 69 6c 6c 20 61 6c 6c  ); and still all
0320: 6f 77 73 0a 20 2a 20 6e 6f 6e 2d 6e 61 6d 65 73  ows. * non-names
0330: 70 61 63 65 64 20 63 6f 64 65 20 74 6f 20 77 6f  paced code to wo
0340: 72 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  rk. Additionally
0350: 20 69 74 20 70 72 65 70 61 72 65 73 20 66 75 74   it prepares fut
0360: 75 72 65 0a 20 2a 20 72 66 63 3a 66 75 6e 63 74  ure. * rfc:funct
0370: 69 6f 6e 5f 61 75 74 6f 6c 6f 61 64 69 6e 67 20  ion_autoloading 
0380: 73 75 70 70 6f 72 74 2e 0a 20 2a 0a 20 2a 20 55  support.. *. * U
0390: 73 69 6e 67 20 74 68 65 20 61 75 74 6f 6c 6f 61  sing the autoloa
03a0: 64 65 72 20 69 73 20 61 73 20 73 69 6d 70 6c 65  der is as simple
03b0: 20 61 73 3a 0a 20 2a 0a 20 2a 20 20 20 69 6e 63   as:. *. *   inc
03c0: 6c 75 64 65 5f 6f 6e 63 65 28 22 73 68 61 72 65  lude_once("share
03d0: 64 2e 70 68 61 72 22 29 3b 0a 20 2a 0a 20 2a 20  d.phar");. *. * 
03e0: 49 6e 76 6f 6b 65 20 69 74 20 66 72 6f 6d 20 74  Invoke it from t
03f0: 68 65 20 63 6f 6d 6d 61 6e 64 6c 69 6e 65 20 74  he commandline t
0400: 6f 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 74  o update the int
0410: 65 72 6e 61 6c 20 6d 61 70 3a 0a 20 2a 0a 20 2a  ernal map:. *. *
0420: 20 20 20 70 68 70 20 2e 2f 73 68 61 72 65 64 2e     php ./shared.
0430: 70 68 61 72 0a 20 2a 0a 20 2a 20 46 6f 72 20 64  phar. *. * For d
0440: 65 76 65 6c 6f 70 6d 65 6e 74 20 28 6e 6f 6e 2d  evelopment (non-
0450: 64 65 70 6c 6f 79 6d 65 6e 74 29 20 73 65 74 75  deployment) setu
0460: 70 73 2c 20 63 6f 6e 66 69 67 75 72 65 20 61 75  ps, configure au
0470: 74 6f 6d 61 74 69 63 0a 20 2a 20 75 70 64 61 74  tomatic. * updat
0480: 65 73 20 70 65 72 20 65 6e 76 69 72 6f 6e 6d 65  es per environme
0490: 6e 74 20 73 65 74 74 69 6e 67 2c 20 65 2e 67 2e  nt setting, e.g.
04a0: 20 76 69 61 20 2e 68 74 61 63 63 65 73 73 3a 0a   via .htaccess:.
04b0: 20 2a 0a 20 2a 20 20 20 53 65 74 45 6e 76 20 41   *. *   SetEnv A
04c0: 55 54 4f 4c 4f 41 44 45 52 5f 55 50 44 41 54 45  UTOLOADER_UPDATE
04d0: 20 31 0a 20 2a 0a 20 2a 20 54 68 65 20 70 68 61   1. *. * The pha
04e0: 72 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  r could also be 
04f0: 73 70 6c 69 74 20 75 70 20 69 6e 74 6f 20 73 65  split up into se
0500: 70 61 72 61 74 65 20 61 75 74 6f 6c 6f 61 64 2c  parate autoload,
0510: 20 6d 61 70 0a 20 2a 20 61 6e 64 20 75 70 64 61   map. * and upda
0520: 74 65 20 69 6e 63 6c 75 64 65 73 2e 0a 20 2a 0a  te includes.. *.
0530: 20 2a 2f 0a 0a 0a 0a 2f 2f 20 44 65 63 6c 61 72   */....// Declar
0540: 65 64 20 6a 75 73 74 20 6f 6e 63 65 20 66 6f 72  ed just once for
0550: 20 72 65 6c 6f 63 61 74 61 62 6c 65 20 69 6e 73   relocatable ins
0560: 74 61 6e 74 61 74 69 6f 6e 0a 69 66 20 28 21 63  tantation.if (!c
0570: 6c 61 73 73 5f 65 78 69 73 74 73 28 22 43 61 6e  lass_exists("Can
0580: 6f 6e 69 63 5f 41 75 74 6f 6c 6f 61 64 65 72 22  onic_Autoloader"
0590: 29 29 20 7b 0a 20 20 20 20 63 6c 61 73 73 20 43  )) {.    class C
05a0: 61 6e 6f 6e 69 63 5f 41 75 74 6f 6c 6f 61 64 65  anonic_Autoloade
05b0: 72 20 65 78 74 65 6e 64 73 20 41 72 72 61 79 4f  r extends ArrayO
05c0: 62 6a 65 63 74 20 7b 0a 0a 0a 20 20 20 20 20 20  bject {...      
05d0: 20 20 2f 2f 20 53 75 70 70 6f 72 74 20 66 6f 72    // Support for
05e0: 20 72 66 63 3a 66 75 6e 63 74 69 6f 6e 5f 61 75   rfc:function_au
05f0: 74 6f 6c 6f 61 64 69 6e 67 20 69 64 65 6e 74 69  toloading identi
0600: 66 69 65 72 20 74 79 70 69 6e 67 2e 0a 20 20 20  fier typing..   
0610: 20 20 20 20 20 70 75 62 6c 69 63 20 24 74 79 70       public $typ
0620: 65 73 20 3d 20 61 72 72 61 79 28 31 3d 3e 22 63  es = array(1=>"c
0630: 6c 61 73 73 22 2c 20 32 3d 3e 22 66 75 6e 63 74  lass", 2=>"funct
0640: 69 6f 6e 22 2c 20 34 3d 3e 22 63 6f 6e 73 74 22  ion", 4=>"const"
0650: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 42  );..        // B
0660: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ase directory fo
0670: 72 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 73  r relative paths
0680: 20 6f 72 20 70 68 61 72 3a 2f 2f 20 70 61 74 68   or phar:// path
0690: 73 20 69 6e 20 6d 61 70 2e 0a 20 20 20 20 20 20  s in map..      
06a0: 20 20 70 75 62 6c 69 63 20 24 62 61 73 65 64 69    public $basedi
06b0: 72 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  r = "";.        
06c0: 70 75 62 6c 69 63 20 24 62 61 73 65 66 6e 20 3d  public $basefn =
06d0: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 0a 20 20   "";.        .  
06e0: 20 20 20 20 20 20 2f 2f 20 54 72 79 20 74 6f 20        // Try to 
06f0: 72 65 62 75 69 6c 64 20 6d 61 70 20 6f 6e 20 6d  rebuild map on m
0700: 69 73 73 69 6e 67 20 69 64 65 6e 74 69 66 69 65  issing identifie
0710: 72 73 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c  rs..        publ
0720: 69 63 20 24 61 75 74 6f 5f 75 70 64 61 74 65 20  ic $auto_update 
0730: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 0a 0a  = 0;..        ..
0740: 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20          /**.    
0750: 20 20 20 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a       * Initializ
0760: 65 20 6d 61 70 2e 0a 20 20 20 20 20 20 20 20 20  e map..         
0770: 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70 61  *.         * @pa
0780: 72 61 6d 20 20 61 72 72 61 79 20 20 20 24 6d 61  ram  array   $ma
0790: 70 20 20 20 20 20 20 20 20 43 6f 6e 74 61 69 6e  p        Contain
07a0: 73 20 61 20 74 79 70 65 2d 3e 69 64 65 6e 74 69  s a type->identi
07b0: 66 69 65 72 2d 3e 66 69 6c 65 6e 61 6d 65 20 6d  fier->filename m
07c0: 61 70 2e 0a 20 20 20 20 20 20 20 20 20 2a 20 40  ap..         * @
07d0: 70 61 72 61 6d 20 20 73 74 72 69 6e 67 20 20 24  param  string  $
07e0: 62 61 73 65 66 6e 20 20 20 20 20 4c 6f 63 61 74  basefn     Locat
07f0: 69 6f 6e 20 6f 66 20 73 74 75 62 20 28 73 68 61  ion of stub (sha
0800: 72 65 64 2e 70 68 61 72 29 2c 20 77 68 69 63 68  red.phar), which
0810: 20 63 6c 61 73 73 70 61 74 68 20 62 61 73 65 64   classpath based
0820: 69 72 20 28 75 73 75 61 6c 6c 79 20 5f 5f 44 49  ir (usually __DI
0830: 52 5f 5f 29 20 69 73 20 64 65 72 69 76 65 64 20  R__) is derived 
0840: 66 72 6f 6d 2e 0a 20 20 20 20 20 20 20 20 20 2a  from..         *
0850: 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
0860: 20 20 20 20 20 70 75 62 6c 69 63 20 66 75 6e 63       public func
0870: 74 69 6f 6e 20 5f 5f 63 6f 6e 73 74 72 75 63 74  tion __construct
0880: 28 24 6d 61 70 2c 20 24 62 61 73 65 66 6e 29 20  ($map, $basefn) 
0890: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  {.            $t
08a0: 68 69 73 2d 3e 62 61 73 65 64 69 72 20 3d 20 64  his->basedir = d
08b0: 69 72 6e 61 6d 65 28 24 62 61 73 65 66 6e 29 3b  irname($basefn);
08c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74 68  .            $th
08d0: 69 73 2d 3e 62 61 73 65 66 6e 20 3d 20 24 62 61  is->basefn = $ba
08e0: 73 65 66 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  sefn;.          
08f0: 20 20 70 61 72 65 6e 74 3a 3a 5f 5f 63 6f 6e 73    parent::__cons
0900: 74 72 75 63 74 28 24 6d 61 70 29 3b 0a 20 20 20  truct($map);.   
0910: 20 20 20 20 20 20 20 20 20 24 74 68 69 73 2d 3e           $this->
0920: 61 75 74 6f 5f 75 70 64 61 74 65 20 7c 3d 20 21  auto_update |= !
0930: 65 6d 70 74 79 28 24 5f 53 45 52 56 45 52 5b 22  empty($_SERVER["
0940: 41 55 54 4f 4c 4f 41 44 45 52 5f 55 50 44 41 54  AUTOLOADER_UPDAT
0950: 45 22 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  E"]).           
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 20 20 61 6e 64 20 69 73 5f 77 72         and is_wr
0980: 69 74 65 61 62 6c 65 28 24 74 68 69 73 2d 3e 62  iteable($this->b
0990: 61 73 65 66 6e 29 3b 20 2f 2f 20 61 70 74 20 66  asefn); // apt f
09a0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  or the default c
09b0: 61 73 65 20 6f 66 20 75 73 69 6e 67 20 73 68 61  ase of using sha
09c0: 72 65 64 2e 70 68 61 72 0a 20 20 20 20 20 20 20  red.phar.       
09d0: 20 7d 0a 0a 0a 0a 20 20 20 20 20 20 20 20 2f 2a   }....        /*
09e0: 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 4c 6f 6f  *.         * Loo
09f0: 6b 20 74 6f 2d 62 65 20 6c 6f 61 64 65 64 20 63  k to-be loaded c
0a00: 6c 61 73 73 6e 61 6d 65 2f 66 75 6e 63 74 69 6f  lassname/functio
0a10: 6e 20 75 70 20 69 6e 20 69 64 6d 61 70 2c 0a 20  n up in idmap,. 
0a20: 20 20 20 20 20 20 20 20 2a 20 61 6e 64 20 6c 6f          * and lo
0a30: 61 64 20 69 6e 63 6c 75 64 65 20 73 63 72 69 70  ad include scrip
0a40: 74 2e 0a 20 20 20 20 20 20 20 20 20 2a 0a 20 20  t..         *.  
0a50: 20 20 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20         * @param 
0a60: 20 73 74 72 69 6e 67 20 20 24 6e 61 6d 65 20 20   string  $name  
0a70: 20 20 20 20 20 49 64 65 6e 74 69 66 69 65 72 20       Identifier 
0a80: 74 6f 20 61 75 74 6f 6c 6f 61 64 2e 0a 20 20 20  to autoload..   
0a90: 20 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 20        * @param  
0aa0: 69 6e 74 20 20 20 20 20 24 74 79 70 65 20 20 20  int     $type   
0ab0: 20 20 20 20 57 65 74 68 65 72 20 69 74 27 73 20      Wether it's 
0ac0: 61 20 63 6c 61 73 73 2c 20 66 75 6e 63 74 69 6f  a class, functio
0ad0: 6e 2c 20 63 6f 6e 73 74 20 69 64 65 6e 74 69 66  n, const identif
0ae0: 69 65 72 2e 0a 20 20 20 20 20 20 20 20 20 2a 20  ier..         * 
0af0: 40 72 65 74 75 72 6e 20 76 6f 69 64 0a 20 20 20  @return void.   
0b00: 20 20 20 20 20 20 2a 0a 20 20 20 20 20 20 20 20        *.        
0b10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 62 6c   */.        publ
0b20: 69 63 20 66 75 6e 63 74 69 6f 6e 20 5f 5f 69 6e  ic function __in
0b30: 76 6f 6b 65 28 24 6e 61 6d 65 2c 20 24 74 79 70  voke($name, $typ
0b40: 65 3d 22 63 6c 61 73 73 22 29 20 7b 0a 0a 20 20  e="class") {..  
0b50: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 72            // Nor
0b60: 6d 61 6c 69 7a 65 20 69 64 65 6e 74 69 66 69 65  malize identifie
0b70: 72 20 6c 6f 6f 6b 75 70 0a 20 20 20 20 20 20 20  r lookup.       
0b80: 20 20 20 20 20 24 6e 61 6d 65 20 3d 20 73 74 72       $name = str
0b90: 74 6f 6c 6f 77 65 72 28 24 6e 61 6d 65 29 3b 0a  tolower($name);.
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0bb0: 69 73 5f 69 6e 74 28 24 74 79 70 65 29 29 20 7b  is_int($type)) {
0bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0bd0: 20 24 74 79 70 65 20 3d 20 24 74 68 69 73 2d 3e   $type = $this->
0be0: 74 79 70 65 73 5b 24 74 79 70 65 5d 3b 0a 20 20  types[$type];.  
0bf0: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
0c00: 20 20 20 20 20 20 20 20 20 2f 2f 20 43 68 65 63           // Chec
0c10: 6b 20 66 6f 72 20 64 65 63 6c 61 72 61 74 69 6f  k for declaratio
0c20: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  n.            if
0c30: 20 28 69 73 73 65 74 28 24 74 68 69 73 5b 24 74   (isset($this[$t
0c40: 79 70 65 5d 5b 24 6e 61 6d 65 5d 29 29 0a 20 20  ype][$name])).  
0c50: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74              $pat
0c70: 68 20 3d 20 24 74 68 69 73 5b 24 74 79 70 65 5d  h = $this[$type]
0c80: 5b 24 6e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 20  [$name];.       
0c90: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
0ca0: 20 20 20 20 2f 2f 20 41 6e 64 20 6c 6f 61 64 20      // And load 
0cb0: 61 63 63 6f 72 64 69 6e 67 20 69 6e 63 6c 75 64  according includ
0cc0: 65 20 73 63 72 69 70 74 0a 20 20 20 20 20 20 20  e script.       
0cd0: 20 20 20 20 20 69 66 20 28 69 73 73 65 74 28 24       if (isset($
0ce0: 70 61 74 68 29 29 0a 20 20 20 20 20 20 20 20 20  path)).         
0cf0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
0d00: 20 20 20 20 20 2f 2f 20 43 6f 6e 76 65 72 74 20       // Convert 
0d10: 72 65 6c 61 74 69 76 65 20 70 61 74 68 73 0a 20  relative paths. 
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0d30: 66 20 28 24 70 61 74 68 5b 30 5d 20 21 3d 20 22  f ($path[0] != "
0d40: 2f 22 29 20 7b 0a 0a 20 20 20 20 20 20 20 20 20  /") {..         
0d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65             // Re
0d60: 6c 61 74 69 76 65 20 64 69 72 65 63 74 6f 72 79  lative directory
0d70: 2c 20 69 66 20 6e 6f 20 70 68 61 72 3a 20 70 72  , if no phar: pr
0d80: 65 66 69 78 0a 20 20 20 20 20 20 20 20 20 20 20  efix.           
0d90: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
0da0: 6e 63 6d 70 28 24 70 61 74 68 2c 20 22 70 68 61  ncmp($path, "pha
0db0: 72 3a 2f 2f 22 2c 20 37 29 29 20 7b 0a 20 20 20  r://", 7)) {.   
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 20 20 24 70 61 74 68 20 3d 20 22 24 74       $path = "$t
0de0: 68 69 73 2d 3e 62 61 73 65 64 69 72 2f 24 70 61  his->basedir/$pa
0df0: 74 68 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  th";.           
0e00: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 2f 2f 20 49 66 20 6e 6f 6e 2d 61 62 73 6f 6c 75  // If non-absolu
0e30: 74 65 20 70 68 61 72 3a 2f 2f 20 75 72 6c 2c 20  te phar:// url, 
0e40: 69 6e 6a 65 63 74 20 62 61 73 65 64 69 72 0a 20  inject basedir. 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 65 6c 73 65 69 66 20 28 24 70 61 74 68     elseif ($path
0e70: 5b 37 5d 20 21 3d 3d 20 22 2f 22 29 20 7b 0a 20  [7] !== "/") {. 
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 24 70 61 74 68 20 3d 20 22         $path = "
0ea0: 70 68 61 72 3a 2f 2f 24 74 68 69 73 2d 3e 62 61  phar://$this->ba
0eb0: 73 65 64 69 72 2f 22 20 2e 20 73 75 62 73 74 72  sedir/" . substr
0ec0: 28 24 70 61 74 68 2c 20 37 29 3b 0a 20 20 20 20  ($path, 7);.    
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
0ef0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
0f00: 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 63 6c       return incl
0f10: 75 64 65 5f 6f 6e 63 65 28 24 70 61 74 68 29 3b  ude_once($path);
0f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4f              // O
0f40: 6e 63 65 20 6d 6f 72 65 20 77 69 74 68 20 66 65  nce more with fe
0f50: 65 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  eling.          
0f60: 20 20 69 66 20 28 24 74 68 69 73 2d 3e 61 75 74    if ($this->aut
0f70: 6f 5f 75 70 64 61 74 65 29 20 7b 0a 20 20 20 20  o_update) {.    
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0f90: 72 6e 20 24 74 68 69 73 2d 3e 61 75 74 6f 5f 75  rn $this->auto_u
0fa0: 70 64 61 74 65 28 29 20 61 6e 64 20 24 74 68 69  pdate() and $thi
0fb0: 73 28 24 6e 61 6d 65 2c 20 24 74 79 70 65 29 3b  s($name, $type);
0fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
0fd0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
0fe0: 20 20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a    ..        /**.
0ff0: 20 20 20 20 20 20 20 20 20 2a 20 41 75 74 6f 6d           * Autom
1000: 61 74 69 63 61 6c 6c 79 20 75 70 64 61 74 65 20  atically update 
1010: 63 6c 61 73 73 6d 61 70 20 28 24 74 68 69 73 29  classmap ($this)
1020: 20 61 74 20 72 75 6e 74 69 6d 65 2c 20 66 6f 72   at runtime, for
1030: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 73 65 74   development set
1040: 75 70 73 2e 0a 20 20 20 20 20 20 20 20 20 2a 0a  ups..         *.
1050: 20 20 20 20 20 20 20 20 20 2a 20 40 72 65 74 75           * @retu
1060: 72 6e 20 62 6f 6f 6c 65 61 6e 0a 20 20 20 20 20  rn boolean.     
1070: 20 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a      *.         *
1080: 2f 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  /        .      
1090: 20 20 66 75 6e 63 74 69 6f 6e 20 61 75 74 6f 5f    function auto_
10a0: 75 70 64 61 74 65 28 29 20 7b 0a 20 20 20 20 20  update() {.     
10b0: 20 20 20 20 20 20 20 24 74 68 69 73 2d 3e 61 75         $this->au
10c0: 74 6f 5f 75 70 64 61 74 65 20 3d 20 30 3b 0a 20  to_update = 0;. 
10d0: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
10e0: 20 20 20 20 20 20 20 20 2f 2f 20 4f 6e 6c 79 20          // Only 
10f0: 73 75 63 63 65 65 64 73 20 69 66 20 63 75 72 72  succeeds if curr
1100: 65 6e 74 20 66 69 6e 67 65 72 70 72 69 6e 74 20  ent fingerprint 
1110: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 0a 20 20  doesn't match.  
1120: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69 73            if (is
1130: 73 65 74 28 24 74 68 69 73 5b 22 66 70 22 5d 29  set($this["fp"])
1140: 20 61 6e 64 20 24 6d 61 70 20 3d 20 73 65 6c 66   and $map = self
1150: 3a 3a 75 70 64 61 74 65 28 24 74 68 69 73 2d 3e  ::update($this->
1160: 62 61 73 65 66 6e 2c 20 24 74 68 69 73 5b 22 66  basefn, $this["f
1170: 70 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  p"])) {.        
1180: 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 3a 3a          parent::
1190: 5f 5f 63 6f 6e 73 74 72 75 63 74 28 24 6d 61 70  __construct($map
11a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11b0: 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11d0: 20 20 20 20 20 20 7d 0a 0a 0a 0a 0a 20 20 20 20        }.....    
11e0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20      /**.        
11f0: 20 2a 20 55 6e 70 61 63 6b 61 67 65 64 20 2e 70   * Unpackaged .p
1200: 68 61 72 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  har handling..  
1210: 20 20 20 20 20 20 20 2a 0a 20 20 20 20 20 20 20         *.       
1220: 20 20 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20    * The purpose 
1230: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1240: 20 73 74 61 74 69 63 20 6d 65 74 68 6f 64 73 20   static methods 
1250: 69 73 20 74 6f 20 61 6c 6c 6f 77 20 68 61 76 69  is to allow havi
1260: 6e 67 20 73 65 70 61 72 61 74 65 0a 20 20 20 20  ng separate.    
1270: 20 20 20 20 20 2a 20 60 61 75 74 6f 6c 6f 61 64       * `autoload
1280: 2e 70 68 70 60 20 61 6e 64 20 60 61 75 74 6f 6c  .php` and `autol
1290: 6f 61 64 2e 6d 61 70 2e 70 68 70 60 20 61 6e 64  oad.map.php` and
12a0: 20 60 61 75 74 6f 6c 6f 61 64 2e 75 70 64 61 74   `autoload.updat
12b0: 65 2e 70 68 70 60 20 73 63 72 69 70 74 73 0a 20  e.php` scripts. 
12c0: 20 20 20 20 20 20 20 20 2a 20 72 65 73 69 64 65          * reside
12d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
12e0: 65 63 74 6f 72 79 2c 20 69 6e 73 74 65 61 64 20  ectory, instead 
12f0: 6f 66 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  of in the shared
1300: 2e 70 68 61 72 2f 0a 20 20 20 20 20 20 20 20 20  .phar/.         
1310: 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 70 68 61  *.         * pha
1320: 72 42 61 73 65 28 29 20 64 6f 65 73 20 64 65 63  rBase() does dec
1330: 69 64 65 20 6f 6e 20 63 75 72 72 65 6e 74 20 5f  ide on current _
1340: 5f 46 49 4c 45 5f 5f 20 6c 6f 63 61 74 69 6f 6e  _FILE__ location
1350: 20 69 66 20 72 75 6e 20 77 69 74 68 69 6e 20 2e   if run within .
1360: 70 68 61 72 0a 20 20 20 20 20 20 20 20 20 2a 20  phar.         * 
1370: 63 6f 6e 74 65 78 74 2c 20 6f 72 20 61 73 20 73  context, or as s
1380: 74 61 6e 64 61 6c 6f 6e 65 20 69 6e 63 6c 75 64  tandalone includ
1390: 65 2e 20 54 68 65 20 62 61 73 65 64 69 72 20 61  e. The basedir a
13a0: 6e 64 20 6d 61 70 66 69 6c 65 20 6c 6f 63 61 74  nd mapfile locat
13b0: 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
13c0: 20 2a 20 73 65 74 75 70 20 61 63 63 6f 72 64 69   * setup accordi
13d0: 6e 67 6c 79 2e 0a 20 20 20 20 20 20 20 20 20 2a  ngly..         *
13e0: 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
13f0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
1400: 2f 20 46 69 6c 65 20 6c 6f 63 61 74 69 6f 6e 73  / File locations
1410: 2c 20 65 69 74 68 65 72 20 70 68 61 72 3a 20 65  , either phar: e
1420: 6e 74 72 69 65 73 20 6f 72 20 69 6e 20 2e 2f 20  ntries or in ./ 
1430: 6c 6f 63 61 6c 20 64 69 72 2e 0a 20 20 20 20 20  local dir..     
1440: 20 20 20 2f 2f 20 43 6f 6e 73 69 64 65 72 20 74     // Consider t
1450: 68 65 73 65 20 66 69 78 61 74 65 64 2e 20 49 6e  hese fixated. In
1460: 20 63 61 73 65 20 6f 66 20 61 20 67 6c 6f 62 61   case of a globa
1470: 6c 20 61 6e 64 20 6c 6f 63 61 6c 20 73 68 61 72  l and local shar
1480: 65 64 2e 70 68 61 72 2c 20 6f 6e 6c 79 20 65 69  ed.phar, only ei
1490: 74 68 65 72 20 64 65 63 6c 61 72 61 74 69 6f 6e  ther declaration
14a0: 20 6f 66 20 43 61 6e 6f 6e 69 63 5f 43 6c 61 73   of Canonic_Clas
14b0: 73 6d 61 70 20 63 61 6e 20 64 65 66 69 6e 65 20  smap can define 
14c0: 74 68 65 6d 2e 0a 20 20 20 20 20 20 20 20 63 6f  them..        co
14d0: 6e 73 74 20 4d 41 50 5f 46 49 4c 45 20 3d 20 22  nst MAP_FILE = "
14e0: 61 75 74 6f 6c 6f 61 64 2e 6d 61 70 2e 70 68 70  autoload.map.php
14f0: 22 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ";.        const
1500: 20 55 50 44 41 54 45 5f 4c 49 42 20 3d 20 22 61   UPDATE_LIB = "a
1510: 75 74 6f 6c 6f 61 64 2e 75 70 64 61 74 65 2e 70  utoload.update.p
1520: 68 70 22 3b 0a 0a 0a 20 20 20 20 20 20 20 20 2f  hp";...        /
1530: 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 43 72  **.         * Cr
1540: 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 61 6e  eate instance an
1550: 64 20 72 65 67 69 73 74 65 72 20 69 74 2e 0a 20  d register it.. 
1560: 20 20 20 20 20 20 20 20 2a 0a 20 20 20 20 20 20          *.      
1570: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75     */.        pu
1580: 62 6c 69 63 20 73 74 61 74 69 63 20 66 75 6e 63  blic static func
1590: 74 69 6f 6e 20 68 6f 6f 6b 75 70 28 24 62 61 73  tion hookup($bas
15a0: 65 66 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  efn) {.         
15b0: 20 20 20 73 70 6c 5f 61 75 74 6f 6c 6f 61 64 5f     spl_autoload_
15c0: 72 65 67 69 73 74 65 72 28 0a 20 20 20 20 20 20  register(.      
15d0: 20 20 20 20 20 20 20 20 20 20 24 69 20 3d 20 6e            $i = n
15e0: 65 77 20 43 61 6e 6f 6e 69 63 5f 41 75 74 6f 6c  ew Canonic_Autol
15f0: 6f 61 64 65 72 28 20 69 6e 63 6c 75 64 65 28 73  oader( include(s
1600: 65 6c 66 3a 3a 70 68 61 72 42 61 73 65 28 24 62  elf::pharBase($b
1610: 61 73 65 66 6e 29 20 2e 20 73 65 6c 66 3a 3a 4d  asefn) . self::M
1620: 41 50 5f 46 49 4c 45 29 2c 20 24 62 61 73 65 66  AP_FILE), $basef
1630: 6e 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ).            
1640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1650: 65 6c 66 3a 3a 24 69 6e 73 74 61 6e 63 65 73 5b  elf::$instances[
1660: 5d 20 3d 20 24 69 3b 0a 20 20 20 20 20 20 20 20  ] = $i;.        
1670: 7d 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  }.        .     
1680: 20 20 20 2f 2f 20 6b 65 65 70 20 61 20 72 65 66     // keep a ref
1690: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20 20 73  erence.        s
16a0: 74 61 74 69 63 20 24 69 6e 73 74 61 6e 63 65 73  tatic $instances
16b0: 20 3d 20 61 72 72 61 79 28 29 3b 0a 0a 20 20 20   = array();..   
16c0: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20    .        /**. 
16d0: 20 20 20 20 20 20 20 20 2a 20 52 65 63 72 65 61          * Recrea
16e0: 74 65 20 63 6c 61 73 73 6d 61 70 20 77 69 74 68  te classmap with
16f0: 69 6e 20 74 68 65 20 70 68 61 72 20 2f 20 4f 72  in the phar / Or
1700: 20 61 73 20 73 65 70 61 72 61 74 65 20 61 75 74   as separate aut
1710: 6f 6c 6f 61 64 2e 6d 61 70 2e 70 68 70 20 66 69  oload.map.php fi
1720: 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 2a 0a 20  le..         *. 
1730: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1740: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1750: 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65   function update
1760: 28 24 62 61 73 65 66 6e 2c 20 24 66 70 3d 4e 55  ($basefn, $fp=NU
1770: 4c 4c 29 20 7b 0a 0a 20 20 20 20 20 20 20 20 20  LL) {..         
1780: 20 20 20 2f 2f 20 4c 6f 61 64 20 75 74 69 6c 73     // Load utils
1790: 20 6d 61 6e 75 61 6c 6c 79 2e 20 4e 6f 77 20 74   manually. Now t
17a0: 68 61 74 27 73 20 74 6f 6f 20 75 6e 66 6f 72 74  hat's too unfort
17b0: 75 6e 61 74 65 2c 20 62 75 74 20 73 65 6e 73 69  unate, but sensi
17c0: 62 6c 65 20 66 6f 72 20 63 6c 65 61 6e 20 2e 70  ble for clean .p
17d0: 68 61 72 20 64 69 73 74 72 69 62 75 74 69 6f 6e  har distribution
17e0: 20 61 6e 64 20 72 65 6c 6f 63 61 74 61 62 69 6c   and relocatabil
17f0: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ity..           
1800: 20 63 6c 61 73 73 5f 65 78 69 73 74 73 28 22 43   class_exists("C
1810: 61 6e 6f 6e 69 63 5f 43 6c 61 73 73 6d 61 70 22  anonic_Classmap"
1820: 2c 20 66 61 6c 73 65 29 20 6f 72 0a 20 20 20 20  , false) or.    
1830: 20 20 20 20 20 20 20 20 69 6e 63 6c 75 64 65 5f          include_
1840: 6f 6e 63 65 28 73 65 6c 66 3a 3a 70 68 61 72 42  once(self::pharB
1850: 61 73 65 28 24 62 61 73 65 66 6e 29 20 2e 20 73  ase($basefn) . s
1860: 65 6c 66 3a 3a 55 50 44 41 54 45 5f 4c 49 42 29  elf::UPDATE_LIB)
1870: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
1880: 2f 20 55 70 64 61 74 65 20 66 72 6f 6d 20 73 75  / Update from su
1890: 62 64 69 72 65 63 74 6f 72 69 65 73 2e 0a 20 20  bdirectories..  
18a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18b0: 20 43 61 6e 6f 6e 69 63 5f 43 6c 61 73 73 6d 61   Canonic_Classma
18c0: 70 3a 3a 75 70 64 61 74 65 28 20 73 65 6c 66 3a  p::update( self:
18d0: 3a 70 68 61 72 42 61 73 65 28 24 62 61 73 65 66  :pharBase($basef
18e0: 6e 29 20 2e 20 73 65 6c 66 3a 3a 4d 41 50 5f 46  n) . self::MAP_F
18f0: 49 4c 45 20 2c 20 61 72 72 61 79 28 64 69 72 6e  ILE , array(dirn
1900: 61 6d 65 28 24 62 61 73 65 66 6e 29 29 2c 20 24  ame($basefn)), $
1910: 66 70 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fp );.        }.
1920: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
1930: 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a    /**.         *
1940: 20 42 61 73 65 20 64 69 72 65 63 74 6f 72 79 20   Base directory 
1950: 6f 72 20 70 68 61 72 3a 2f 2f 20 72 6f 6f 74 20  or phar:// root 
1960: 66 6f 72 20 69 6e 73 74 61 6e 74 69 61 74 69 6f  for instantiatio
1970: 6e 20 5f 5f 46 49 4c 45 5f 5f 20 28 73 74 75 62  n __FILE__ (stub
1980: 2e 70 68 70 29 0a 20 20 20 20 20 20 20 20 20 2a  .php).         *
1990: 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
19a0: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
19b0: 69 63 20 66 75 6e 63 74 69 6f 6e 20 70 68 61 72  ic function phar
19c0: 42 61 73 65 28 24 62 61 73 65 66 6e 29 20 7b 0a  Base($basefn) {.
19d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
19e0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 66 20  depending on if 
19f0: 5f 5f 46 49 4c 45 5f 5f 20 77 61 73 20 61 20 2e  __FILE__ was a .
1a00: 70 68 61 72 0a 20 20 20 20 20 20 20 20 20 20 20  phar.           
1a10: 20 69 66 20 28 73 75 62 73 74 72 28 24 62 61 73   if (substr($bas
1a20: 65 66 6e 2c 20 2d 35 29 20 3d 3d 20 22 2e 70 68  efn, -5) == ".ph
1a30: 61 72 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ar") {.         
1a40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 70         return "p
1a50: 68 61 72 3a 2f 2f 24 62 61 73 65 66 6e 2f 22 3b  har://$basefn/";
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 75 73             // us
1a80: 65 20 69 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  e its surroundin
1a90: 67 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 70  g directory if p
1aa0: 6c 61 69 6e 20 2e 70 68 70 20 66 69 6c 65 0a 20  lain .php file. 
1ab0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
1ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ad0: 20 20 72 65 74 75 72 6e 20 64 69 72 6e 61 6d 65    return dirname
1ae0: 28 24 62 61 73 65 66 6e 29 20 2e 20 22 2f 22 3b  ($basefn) . "/";
1af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b00: 20 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20         }...     
1b10: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20     /**.         
1b20: 2a 20 4c 6f 61 64 73 20 6d 65 74 61 20 64 61 74  * Loads meta dat
1b30: 61 20 60 6d 61 70 60 20 66 72 6f 6d 20 66 70 6d  a `map` from fpm
1b40: 2f 78 70 6d 2d 67 65 6e 65 72 61 74 65 64 20 2e  /xpm-generated .
1b50: 70 68 61 72 2f 63 6f 6d 70 6f 73 65 72 20 70 61  phar/composer pa
1b60: 63 6b 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20  ckages..        
1b70: 20 2a 20 54 68 65 20 6d 61 70 5b 5d 20 68 61 73   * The map[] has
1b80: 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1b90: 75 72 65 20 61 73 20 73 68 61 72 65 64 2e 70 68  ure as shared.ph
1ba0: 61 72 73 60 20 69 74 73 65 6c 66 2e 0a 20 20 20  ars` itself..   
1bb0: 20 20 20 20 20 20 2a 0a 20 20 20 20 20 20 20 20        *.        
1bc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 62 6c   */.        publ
1bd0: 69 63 20 73 74 61 74 69 63 20 66 75 6e 63 74 69  ic static functi
1be0: 6f 6e 20 61 64 64 50 68 61 72 28 24 70 68 61 72  on addPhar($phar
1bf0: 5f 66 6e 29 20 7b 0a 0a 20 20 20 20 20 20 20 20  _fn) {..        
1c00: 20 20 20 20 2f 2f 20 6f 70 65 6e 20 61 6e 64 20      // open and 
1c10: 73 63 61 6e 20 66 6f 72 20 6d 65 74 61 64 61 74  scan for metadat
1c20: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  a.            if
1c30: 20 28 24 6d 61 69 6e 20 3d 20 72 65 73 65 74 28   ($main = reset(
1c40: 73 65 6c 66 3a 3a 24 69 6e 73 74 61 6e 63 65 73  self::$instances
1c50: 29 20 61 6e 64 20 24 70 20 3d 20 6e 65 77 20 50  ) and $p = new P
1c60: 68 61 72 28 24 70 68 61 72 5f 66 6e 2c 20 30 2c  har($phar_fn, 0,
1c70: 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20   NULL).         
1c80: 20 20 20 61 6e 64 20 24 70 2d 3e 68 61 73 4d 65     and $p->hasMe
1c90: 74 61 64 61 74 61 28 29 20 61 6e 64 20 24 6d 65  tadata() and $me
1ca0: 74 61 20 3d 20 24 70 2d 3e 67 65 74 4d 65 74 61  ta = $p->getMeta
1cb0: 64 61 74 61 28 29 20 61 6e 64 20 21 65 6d 70 74  data() and !empt
1cc0: 79 28 24 6d 65 74 61 5b 22 6d 61 70 22 5d 29 29  y($meta["map"]))
1cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cf0: 2f 20 61 64 64 20 74 6f 20 69 6e 73 74 61 6e 63  / add to instanc
1d00: 65 20 63 6c 61 73 73 6d 61 70 20 62 79 20 70 72  e classmap by pr
1d10: 65 70 65 6e 64 69 6e 67 20 70 68 61 72 20 6c 6f  epending phar lo
1d20: 63 61 74 69 6f 6e 20 61 6e 64 20 73 63 68 65 6d  cation and schem
1d30: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1d40: 20 20 66 6f 72 65 61 63 68 20 28 24 6d 61 69 6e    foreach ($main
1d50: 2d 3e 74 79 70 65 73 20 61 73 20 24 74 79 70 65  ->types as $type
1d60: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1d70: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1d80: 28 61 72 72 61 79 5f 63 68 61 6e 67 65 5f 6b 65  (array_change_ke
1d90: 79 5f 63 61 73 65 28 24 6d 65 74 61 5b 22 6d 61  y_case($meta["ma
1da0: 70 22 5d 5b 24 74 79 70 65 5d 29 20 61 73 20 24  p"][$type]) as $
1db0: 69 64 3d 3e 24 66 6e 29 20 7b 0a 20 20 20 20 20  id=>$fn) {.     
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 24 6d 61 69 6e 5b 24 74 79 70 65 5d 5b     $main[$type][
1de0: 24 69 64 5d 20 3d 20 22 70 68 61 72 3a 2f 2f 24  $id] = "phar://$
1df0: 70 68 61 72 5f 66 6e 2f 24 66 6e 22 3b 0a 20 20  phar_fn/$fn";.  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e30: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
1e40: 20 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2f 20 52 65 67     }.}....// Reg
1e50: 69 73 74 65 72 20 6c 6f 61 64 65 72 20 77 69 74  ister loader wit
1e60: 68 20 70 68 61 72 2d 63 6f 6e 74 61 69 6e 65 64  h phar-contained
1e70: 20 69 6e 64 65 6e 74 69 66 69 65 72 20 6d 61 70   indentifier map
1e80: 2e 0a 43 61 6e 6f 6e 69 63 5f 41 75 74 6f 6c 6f  ..Canonic_Autolo
1e90: 61 64 65 72 3a 3a 68 6f 6f 6b 75 70 28 5f 5f 46  ader::hookup(__F
1ea0: 49 4c 45 5f 5f 29 3b 0a 0a 0a 0a 2f 2f 20 49 66  ILE__);....// If
1eb0: 20 61 75 74 6f 6c 6f 61 64 65 72 2e 70 68 61 72   autoloader.phar
1ec0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 64 69 72 65   is invoked dire
1ed0: 63 74 6c 79 20 66 72 6f 6d 20 70 68 70 2d 63 6c  ctly from php-cl
1ee0: 69 2c 20 74 72 69 67 67 65 72 20 75 70 64 61 74  i, trigger updat
1ef0: 65 20 6d 6f 64 65 2e 0a 69 66 20 28 65 6d 70 74  e mode..if (empt
1f00: 79 28 24 5f 53 45 52 56 45 52 5b 22 47 41 54 45  y($_SERVER["GATE
1f10: 57 41 59 5f 49 4e 54 45 52 46 41 43 45 22 5d 29  WAY_INTERFACE"])
1f20: 20 61 6e 64 20 69 73 73 65 74 28 24 5f 53 45 52   and isset($_SER
1f30: 56 45 52 5b 22 61 72 67 76 22 5d 5b 30 5d 29 20  VER["argv"][0]) 
1f40: 61 6e 64 20 28 62 61 73 65 6e 61 6d 65 28 24 5f  and (basename($_
1f50: 53 45 52 56 45 52 5b 22 61 72 67 76 22 5d 5b 30  SERVER["argv"][0
1f60: 5d 29 20 3d 3d 20 62 61 73 65 6e 61 6d 65 28 5f  ]) == basename(_
1f70: 5f 46 49 4c 45 5f 5f 29 29 29 20 7b 0a 20 20 20  _FILE__))) {.   
1f80: 20 43 61 6e 6f 6e 69 63 5f 41 75 74 6f 6c 6f 61   Canonic_Autoloa
1f90: 64 65 72 3a 3a 75 70 64 61 74 65 28 5f 5f 46 49  der::update(__FI
1fa0: 4c 45 5f 5f 29 3b 0a 7d 0a 0a 0a 0a 2f 2f 20 50  LE__);.}....// P
1fb0: 68 61 72 20 73 74 75 62 20 65 6e 64 0a 5f 5f 48  har stub end.__H
1fc0: 41 4c 54 5f 43 4f 4d 50 49 4c 45 52 28 29 3b 20  ALT_COMPILER(); 
1fd0: 3f 3e                                            ?>