Map-based autoloader across php and phar resources

⌈⌋ branch:  Canonic Autoloader


Hex Artifact Content

Artifact 74c1de8d0dcbb9ffc5389c24ee45455c58183bc9:

  • File README — part of check-in [9a42dc06af] at 2015-01-22 19:43:06 on branch trunk — Update notes about pharmap.php and addPhar(). (Section about recommended alternative autoloaders finally committed.) (user: mario size: 4344)

0000: 0a 43 61 6e 6f 6e 69 63 20 41 75 74 6f 6c 6f 61  .Canonic Autoloa
0010: 64 65 72 0a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  der.------------
0020: 2d 2d 2d 2d 2d 2d 0a 0a 73 68 61 72 65 64 2e 70  ------..shared.p
0030: 68 61 72 20 69 73 20 61 20 50 48 50 20 61 75 74  har is a PHP aut
0040: 6f 6c 6f 61 64 65 72 20 66 6f 72 20 63 6c 61 73  oloader for clas
0050: 73 65 73 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ses and function
0060: 73 2e 20 49 74 27 73 20 6d 61 70 2d 62 61 73 65  s. It's map-base
0070: 64 0a 61 6e 64 20 73 65 6c 66 2d 63 6f 6e 74 61  d.and self-conta
0080: 69 6e 65 64 20 69 6e 20 61 20 63 6f 6d 70 72 65  ined in a compre
0090: 73 73 65 64 20 70 68 61 72 2e 0a 0a 0a 20 e2 86  ssed phar.... ..
00a0: 92 20 49 74 20 73 63 61 6e 73 20 62 6f 74 68 20  . It scans both 
00b0: 2e 70 68 70 20 73 63 72 69 70 74 73 20 61 6e 64  .php scripts and
00c0: 20 2e 70 68 61 72 20 63 6f 6c 6c 65 63 74 69 6f   .phar collectio
00d0: 6e 73 20 66 6f 72 20 63 6c 61 73 73 20 64 65 63  ns for class dec
00e0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 0a 20 e2 86 92  larations... ...
00f0: 20 48 6f 6e 6f 72 73 20 50 48 50 20 73 65 6d 61   Honors PHP sema
0100: 6e 74 69 63 73 20 61 6e 64 20 61 76 6f 69 64 73  ntics and avoids
0110: 20 70 6c 61 74 74 66 6f 72 6d 20 61 6d 62 69 67   plattform ambig
0120: 75 69 74 79 20 62 79 20 69 6e 74 65 72 70 72 65  uity by interpre
0130: 74 69 6e 67 20 61 6c 6c 0a 20 20 20 69 64 65 6e  ting all.   iden
0140: 74 69 66 69 65 72 73 20 63 61 73 65 2d 69 6e 73  tifiers case-ins
0150: 65 6e 73 69 74 69 76 65 6c 79 2e 0a 0a 20 e2 86  ensitively... ..
0160: 92 20 43 61 6e 20 62 65 20 75 70 64 61 74 65 64  . Can be updated
0170: 20 6d 61 6e 75 61 6c 6c 79 20 6f 72 20 69 6d 70   manually or imp
0180: 6c 69 63 69 74 6c 79 20 28 41 55 54 4f 4c 4f 41  licitly (AUTOLOA
0190: 44 45 52 5f 55 50 44 41 54 45 20 65 6e 76 20 76  DER_UPDATE env v
01a0: 61 72 69 61 62 6c 65 29 2e 0a 0a 0a 55 73 61 67  ariable)....Usag
01b0: 65 0a 2d 2d 2d 2d 2d 0a 0a 55 73 69 6e 67 20 69  e.-----..Using i
01c0: 74 20 69 73 20 61 73 20 73 69 6d 70 6c 65 20 61  t is as simple a
01d0: 73 3a 0a 0a 20 20 20 20 69 6e 63 6c 75 64 65 28  s:..    include(
01e0: 22 2e 2f 76 65 6e 64 6f 72 2f 73 68 61 72 65 64  "./vendor/shared
01f0: 2e 70 68 61 72 22 29 3b 0a 0a 55 70 64 61 74 69  .phar");..Updati
0200: 6e 67 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ng the internal 
0210: 6d 61 70 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  map can be done 
0220: 66 72 6f 6d 20 74 68 65 20 63 6f 6d 6d 61 6e 64  from the command
0230: 20 6c 69 6e 65 3a 0a 0a 20 20 20 20 70 68 70 20   line:..    php 
0240: 2d 64 70 68 61 72 2e 72 65 61 64 6f 6e 6c 79 3d  -dphar.readonly=
0250: 30 20 2e 2f 73 68 61 72 65 64 2e 70 68 61 72 0a  0 ./shared.phar.
0260: 0a 49 74 27 73 20 63 75 72 72 65 6e 74 6c 79 20  .It's currently 
0270: 62 65 73 74 20 74 6f 20 64 6f 20 73 6f 20 69 6e  best to do so in
0280: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 6a 65 63   the main projec
0290: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 41 6c 6c  t directory. All
02a0: 20 73 63 72 69 70 74 73 0a 61 72 65 20 73 63 61   scripts.are sca
02b0: 6e 6e 65 64 20 66 6f 72 20 63 6c 61 73 73 2f 66  nned for class/f
02c0: 75 6e 63 74 69 6f 6e 2f 63 6f 6e 73 74 20 64 65  unction/const de
02d0: 63 6c 61 72 61 74 69 6f 6e 73 20 62 65 6c 6f 77  clarations below
02e0: 20 69 74 73 20 62 61 73 65 64 69 72 2e 0a 0a 54   its basedir...T
02f0: 68 65 72 65 27 6c 6c 20 62 65 20 77 61 72 6e 69  here'll be warni
0300: 6e 67 73 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ngs for duplicat
0310: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a  e declarations..
0320: 20 e2 86 92 20 57 68 65 6e 20 75 73 69 6e 67 20   ... When using 
0330: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 6f 6b  the internal tok
0340: 65 6e 69 7a 65 72 20 6d 65 74 68 6f 64 2c 20 74  enizer method, t
0350: 68 65 72 65 27 6c 6c 20 61 6c 6c 20 61 6c 73 6f  here'll all also
0360: 20 62 65 0a 20 20 20 77 61 72 6e 69 6e 67 73 20   be.   warnings 
0370: 66 6f 72 20 69 6e 76 61 6c 69 64 6c 79 20 73 74  for invalidly st
0380: 72 75 63 74 75 72 65 64 20 63 6f 64 65 20 62 6c  ructured code bl
0390: 6f 63 6b 73 2e 0a 20 e2 86 92 20 54 68 65 20 64  ocks.. ... The d
03a0: 65 66 61 75 6c 74 20 72 65 67 65 78 20 6d 65 74  efault regex met
03b0: 68 6f 64 20 77 69 6c 6c 20 6d 65 72 65 6c 79 20  hod will merely 
03c0: 69 67 6e 6f 72 65 20 63 6f 64 65 20 6e 65 73 74  ignore code nest
03d0: 69 6e 67 20 65 72 72 6f 72 73 2e 0a 0a 4f 6e 20  ing errors...On 
03e0: 64 65 70 6c 6f 79 6d 65 6e 74 20 60 73 68 61 72  deployment `shar
03f0: 65 64 2e 70 68 61 72 60 20 63 61 6e 20 6a 75 73  ed.phar` can jus
0400: 74 20 62 65 20 63 6f 70 69 65 64 20 61 6c 6f 6e  t be copied alon
0410: 67 20 77 69 74 68 20 74 68 65 20 69 6e 63 6c 75  g with the inclu
0420: 64 65 0a 73 74 72 75 63 74 75 72 65 20 28 41 4b  de.structure (AK
0430: 41 20 63 6c 61 73 73 70 61 74 68 29 2e 0a 0a 0a  A classpath)....
0440: 41 75 74 6f 6d 61 74 69 63 20 73 63 61 6e 6e 69  Automatic scanni
0450: 6e 67 0a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ng.-------------
0460: 2d 2d 2d 2d 2d 0a 0a 46 6f 72 20 64 65 76 65 6c  -----..For devel
0470: 6f 70 6d 65 6e 74 20 73 65 74 75 70 73 20 74 68  opment setups th
0480: 65 20 69 6d 70 6c 69 63 69 74 20 75 70 64 61 74  e implicit updat
0490: 65 20 69 73 20 61 64 76 69 73 61 62 6c 65 2c 20  e is advisable, 
04a0: 77 68 69 63 68 20 6b 69 63 6b 73 20 69 6e 0a 77  which kicks in.w
04b0: 68 65 6e 65 76 65 72 20 61 6e 20 75 6e 6b 6e 6f  henever an unkno
04c0: 77 6e 20 63 6c 61 73 73 20 6e 61 6d 65 20 67 65  wn class name ge
04d0: 74 73 20 72 65 71 75 65 73 74 65 64 2e 20 53 65  ts requested. Se
04e0: 74 20 69 74 20 70 65 72 20 76 69 72 74 75 61 6c  t it per virtual
04f0: 20 64 6f 6d 61 69 6e 0a 77 69 74 68 3a 0a 0a 20   domain.with:.. 
0500: 20 20 20 53 65 74 45 6e 76 20 41 55 54 4f 4c 4f     SetEnv AUTOLO
0510: 41 44 45 52 5f 55 50 44 41 54 45 20 31 0a 0a 54  ADER_UPDATE 1..T
0520: 68 65 6e 20 61 64 61 70 74 69 6e 67 20 70 68 61  hen adapting pha
0530: 72 2e 72 65 61 64 6f 6e 6c 79 3d 30 20 69 6e 20  r.readonly=0 in 
0540: 74 68 65 20 70 68 70 2e 69 6e 69 20 69 73 20 6e  the php.ini is n
0550: 65 63 65 73 73 61 72 79 20 69 6e 20 61 6e 79 20  ecessary in any 
0560: 63 61 73 65 2e 0a 28 57 68 69 63 68 20 77 61 73  case..(Which was
0570: 20 69 6e 74 65 6e 64 65 64 20 61 73 20 73 65 63   intended as sec
0580: 75 72 69 74 79 20 66 65 61 74 75 72 65 20 6f 62  urity feature ob
0590: 76 69 6f 75 73 6c 79 2c 20 74 6f 20 65 73 63 68  viously, to esch
05a0: 65 77 20 6d 61 6e 75 61 6c 20 66 69 6c 65 0a 70  ew manual file.p
05b0: 65 72 6d 69 73 73 69 6f 6e 20 6d 61 6e 61 67 65  ermission manage
05c0: 6d 65 6e 74 20 6f 6e 20 61 20 70 65 72 2d 70 68  ment on a per-ph
05d0: 61 72 20 62 61 73 69 73 2e 29 0a 0a 0a 49 6e 74  ar basis.)...Int
05e0: 65 72 6e 61 6c 20 73 74 72 75 63 74 75 72 65 0a  ernal structure.
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 0a 0a 60 73 68 61 72 65 64 2e 70 68 61 72  --..`shared.phar
0610: 60 20 69 73 20 61 20 5a 49 50 2d 62 61 73 65 64  ` is a ZIP-based
0620: 20 50 68 61 72 2e 20 49 74 73 20 73 74 75 62 20   Phar. Its stub 
0630: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 75 74  contains the aut
0640: 6f 6c 6f 61 64 65 72 20 6c 6f 67 69 63 2c 0a 77  oloader logic,.w
0650: 68 69 6c 65 20 74 68 65 20 63 6c 61 73 73 6d 61  hile the classma
0660: 70 20 69 73 20 6c 6f 63 61 74 65 64 20 69 6e 20  p is located in 
0670: 60 61 75 74 6f 6c 6f 61 64 2e 6d 61 70 2e 70 68  `autoload.map.ph
0680: 70 60 20 61 6e 64 20 74 68 65 20 75 70 64 61 74  p` and the updat
0690: 65 20 63 6f 64 65 20 69 6e 0a 60 61 75 74 6f 6c  e code in.`autol
06a0: 6f 61 64 2e 75 70 64 61 74 65 2e 70 68 70 60 2e  oad.update.php`.
06b0: 0a 0a 43 75 72 72 65 6e 74 20 76 65 72 73 69 6f  ..Current versio
06c0: 6e 73 20 28 30 2e 33 2e 78 29 20 6d 69 67 68 74  ns (0.3.x) might
06d0: 20 62 65 20 73 70 6c 69 74 20 75 70 2c 20 77 68   be split up, wh
06e0: 69 6c 65 20 66 75 74 75 72 65 20 76 65 72 73 69  ile future versi
06f0: 6f 6e 73 20 77 69 6c 6c 20 64 72 6f 70 0a 74 68  ons will drop.th
0700: 61 74 20 6f 70 74 69 6f 6e 2e 0a 0a 0a 43 6f 6d  at option....Com
0710: 70 6f 73 65 72 20 2e 70 68 61 72 73 0a 2d 2d 2d  poser .phars.---
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 59 6f  ------------..Yo
0730: 75 20 6d 69 67 68 74 20 75 73 65 20 68 74 74 70  u might use http
0740: 73 3a 2f 2f 66 6f 73 73 69 6c 2e 69 6e 63 6c 75  s://fossil.inclu
0750: 64 65 2d 6f 6e 63 65 2e 6f 72 67 2f 78 70 6d 2f  de-once.org/xpm/
0760: 20 74 6f 20 63 6f 6e 76 65 72 74 20 65 2e 67 2e   to convert e.g.
0770: 20 63 6f 6d 70 6f 73 65 72 0a 62 75 6e 64 6c 65   composer.bundle
0780: 73 20 69 6e 74 6f 20 73 79 73 74 65 6d 20 61 6e  s into system an
0790: 64 20 2e 70 68 61 72 20 70 61 63 6b 61 67 65 73  d .phar packages
07a0: 3a 0a 0a 20 20 20 78 70 6d 20 2d 73 20 63 6f 6d  :..   xpm -s com
07b0: 70 6f 73 65 72 20 2d 2d 70 68 61 72 20 2d 74 20  poser --phar -t 
07c0: 64 65 62 2c 72 70 6d 2c 70 68 61 72 20 76 6e 64  deb,rpm,phar vnd
07d0: 2f 70 6b 67 0a 0a 57 68 69 63 68 20 74 68 65 6e  /pkg..Which then
07e0: 20 63 6f 6e 74 61 69 6e 20 61 20 60 6d 61 70 60   contain a `map`
07f0: 20 61 72 72 61 79 20 69 6e 20 74 68 65 20 50 68   array in the Ph
0800: 61 72 20 63 6f 6e 74 61 69 6e 65 72 73 20 6d 65  ar containers me
0810: 74 61 20 64 61 74 61 2e 20 49 74 27 73 0a 63 6f  ta data. It's.co
0820: 6d 70 61 74 69 62 6c 65 20 74 6f 20 74 68 65 20  mpatible to the 
0830: 73 68 61 72 65 64 2e 70 68 61 72 2d 69 6e 74 65  shared.phar-inte
0840: 72 6e 61 6c 20 69 64 65 6e 74 69 66 69 65 72 20  rnal identifier 
0850: 6d 61 70 2c 20 61 6e 64 20 63 61 6e 20 65 61 73  map, and can eas
0860: 69 6c 79 20 62 65 0a 72 65 67 69 73 74 65 72 65  ily be.registere
0870: 64 20 28 61 74 20 72 75 6e 74 69 6d 65 29 20 75  d (at runtime) u
0880: 73 69 6e 67 3a 0a 0a 20 20 20 43 61 6e 6f 6e 69  sing:..   Canoni
0890: 63 5f 41 75 74 6f 6c 6f 61 64 65 72 3a 3a 61 64  c_Autoloader::ad
08a0: 64 50 68 61 72 28 22 76 6e 64 2d 70 6b 67 2e 70  dPhar("vnd-pkg.p
08b0: 68 61 72 22 29 3b 0a 0a 54 68 65 20 73 61 6d 65  har");..The same
08c0: 20 6d 61 70 5b 5d 20 63 61 6e 20 62 65 20 63 72   map[] can be cr
08d0: 61 66 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 50  afted into any P
08e0: 68 61 72 20 75 73 69 6e 67 20 74 68 65 20 60 70  har using the `p
08f0: 68 61 72 6d 61 70 2e 70 68 70 60 20 74 6f 6f 6c  harmap.php` tool
0900: 2e 0a 0a 0a 41 70 70 6c 69 63 61 74 69 6f 6e 20  ....Application 
0910: 61 64 76 69 73 65 0a 2d 2d 2d 2d 2d 2d 2d 2d 2d  advise.---------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 20 e2 86 92 20  ---------.. ... 
0930: 50 72 65 66 65 72 72 61 62 6c 79 20 65 6e 63 6f  Preferrably enco
0940: 64 65 20 63 6c 61 73 73 20 6e 61 6d 65 73 20 2a  de class names *
0950: 61 6e 64 2a 20 66 69 6c 65 6e 61 6d 65 73 20 69  and* filenames i
0960: 6e 20 55 54 46 2d 38 2e 0a 0a 20 20 20 50 48 50  n UTF-8...   PHP
0970: 20 35 2e 78 20 69 73 6e 27 74 20 73 74 72 69 63   5.x isn't stric
0980: 74 20 61 62 6f 75 74 20 74 68 69 73 20 61 6e 64  t about this and
0990: 20 6c 69 74 65 72 61 6c 6c 79 20 61 63 63 65 70   literally accep
09a0: 74 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ts any character
09b0: 20 69 6e 0a 20 20 20 74 68 65 20 30 78 37 46 2d   in.   the 0x7F-
09c0: 30 78 46 46 20 72 61 6e 67 65 20 61 73 20 76 61  0xFF range as va
09d0: 6c 69 64 20 66 6f 72 20 69 64 65 6e 74 69 66 69  lid for identifi
09e0: 65 72 73 2e 20 54 68 75 73 20 60 73 68 61 72 65  ers. Thus `share
09f0: 64 2e 70 68 61 72 60 20 64 6f 65 73 20 6e 6f 74  d.phar` does not
0a00: 0a 20 20 20 65 6e 66 6f 72 63 65 20 61 6e 79 74  .   enforce anyt
0a10: 68 69 6e 67 20 65 69 74 68 65 72 2e 0a 0a 20 20  hing either...  
0a20: 20 49 74 27 73 20 63 6f 6d 6d 6f 6e 20 73 65 6e   It's common sen
0a30: 73 65 20 74 6f 20 75 73 65 20 55 6e 69 63 6f 64  se to use Unicod
0a40: 65 2d 76 61 6c 69 64 20 66 69 6c 65 6e 61 6d 65  e-valid filename
0a50: 73 20 68 6f 77 65 76 65 72 20 57 48 45 4e 20 74  s however WHEN t
0a60: 68 65 72 65 27 73 20 61 0a 20 20 20 6e 65 65 64  here's a.   need
0a70: 20 66 6f 72 20 6e 6f 6e 2d 41 53 43 49 49 20 63   for non-ASCII c
0a80: 6c 61 73 73 20 6e 61 6d 65 73 20 6f 72 20 66 69  lass names or fi
0a90: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 20 28 50 72  le names..   (Pr
0aa0: 65 66 65 72 20 70 6c 61 69 6e 20 45 6e 67 6c 69  efer plain Engli
0ab0: 73 68 20 74 68 6f 75 67 68 20 67 65 6e 65 72 61  sh though genera
0ac0: 6c 6c 79 20 66 6f 72 20 64 69 73 74 72 69 62 75  lly for distribu
0ad0: 74 61 62 6c 65 20 63 6f 64 65 21 29 0a 0a 20 e2  table code!).. .
0ae0: 86 92 20 52 65 6d 6f 76 65 20 64 75 70 6c 69 63  .. Remove duplic
0af0: 61 74 65 20 63 6c 61 73 73 20 64 65 63 6c 61 72  ate class declar
0b00: 61 74 69 6f 6e 73 2e 20 55 73 65 20 61 20 73 6f  ations. Use a so
0b10: 75 72 63 65 20 63 6f 64 65 20 76 65 72 73 69 6f  urce code versio
0b20: 6e 69 6e 67 20 73 79 73 74 65 6d 0a 20 20 20 69  ning system.   i
0b30: 6e 73 74 65 61 64 20 6f 66 20 6c 65 61 76 69 6e  nstead of leavin
0b40: 67 20 65 64 69 74 65 64 20 73 74 75 62 73 20 6f  g edited stubs o
0b50: 72 20 6f 6c 64 20 62 61 63 6b 75 70 73 20 69 6e  r old backups in
0b60: 20 79 6f 75 72 20 63 6c 61 73 73 70 61 74 68 2e   your classpath.
0b70: 0a 0a 20 e2 86 92 20 4f 70 74 69 6d 69 7a 65 20  .. ... Optimize 
0b80: 79 6f 75 72 20 63 6c 61 73 73 20 64 65 70 65 6e  your class depen
0b90: 64 65 6e 63 69 65 73 2e 20 57 68 65 6e 20 75 73  dencies. When us
0ba0: 69 6e 67 20 61 20 6d 61 70 2d 62 61 73 65 64 20  ing a map-based 
0bb0: 61 75 74 6f 6c 6f 61 64 65 72 2c 0a 20 20 20 74  autoloader,.   t
0bc0: 68 65 72 65 27 73 20 6e 6f 20 6e 65 65 64 20 74  here's no need t
0bd0: 6f 20 73 63 61 74 74 65 72 20 63 6c 61 73 73 20  o scatter class 
0be0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 63 72  declarations acr
0bf0: 6f 73 73 20 68 75 6e 64 72 65 64 73 20 6f 66 20  oss hundreds of 
0c00: 73 65 70 61 72 61 74 65 0a 20 20 20 73 63 72 69  separate.   scri
0c10: 70 74 73 2e 0a 0a 20 e2 86 92 20 49 74 20 72 75  pts... ... It ru
0c20: 6e 73 20 6f 6e 20 50 48 50 20 35 2e 33 2b 2c 20  ns on PHP 5.3+, 
0c30: 61 6c 62 65 69 74 20 50 48 50 20 35 2e 32 20 28  albeit PHP 5.2 (
0c40: 77 68 69 63 68 20 65 76 65 6e 20 69 6e 20 32 30  which even in 20
0c50: 31 34 20 69 73 20 73 74 69 6c 6c 20 75 73 65 64  14 is still used
0c60: 20 6f 6e 0a 20 20 20 6f 76 65 72 20 32 30 25 20   on.   over 20% 
0c70: 6f 66 20 77 65 62 73 65 72 76 65 72 73 29 20 6d  of webservers) m
0c80: 69 67 68 74 20 77 6f 72 6b 20 74 6f 6f 20 77 69  ight work too wi
0c90: 74 68 20 70 72 65 73 65 6e 74 20 50 45 43 4c 20  th present PECL 
0ca0: 50 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 2e 0a  Phar extension..
0cb0: 0a 0a 41 6c 74 65 72 6e 61 74 69 76 65 73 0a 2d  ..Alternatives.-
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 20 e2 86  -----------.. ..
0cd0: 92 20 5b 41 75 74 6f 6d 61 70 5d 28 68 74 74 70  . [Automap](http
0ce0: 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 66  s://github.com/f
0cf0: 6c 61 75 70 72 65 74 72 65 2f 61 75 74 6f 6d 61  laupretre/automa
0d00: 70 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  p) implements a 
0d10: 73 69 6d 69 6c 61 72 0a 20 20 20 6d 61 70 2d 62  similar.   map-b
0d20: 61 73 65 64 20 61 70 70 72 6f 61 63 68 2c 20 61  ased approach, a
0d30: 6c 73 6f 20 68 69 67 68 6c 79 20 63 6f 6d 70 6c  lso highly compl
0d40: 69 61 6e 74 20 74 6f 20 50 48 50 20 73 65 6d 61  iant to PHP sema
0d50: 6e 74 69 63 73 2c 20 69 6e 63 6c 75 64 69 6e 67  ntics, including
0d60: 0a 20 20 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  .   function and
0d70: 20 63 6f 6e 73 74 61 6e 74 20 64 65 63 6c 61 72   constant declar
0d80: 61 74 69 6f 6e 20 6c 6f 6f 6b 75 70 73 2e 0a 20  ation lookups.. 
0d90: 20 20 54 68 65 20 74 6f 6b 65 6e 20 74 72 61 76    The token trav
0da0: 65 72 73 6f 72 20 6c 6f 6f 6b 73 20 62 65 74 74  ersor looks bett
0db0: 65 72 20 64 65 73 69 67 6e 65 64 20 74 68 61 6e  er designed than
0dc0: 20 74 68 65 20 6f 6e 65 20 69 6e 20 43 61 6e 6f   the one in Cano
0dd0: 6e 69 63 5f 41 75 74 6f 6d 61 70 3b 0a 20 20 20  nic_Automap;.   
0de0: 65 76 65 6e 20 74 61 6b 65 73 20 6d 65 74 61 20  even takes meta 
0df0: 64 65 66 69 6e 69 74 69 6f 6e 73 20 69 6e 74 6f  definitions into
0e00: 20 61 63 63 6f 75 6e 74 2e 0a 20 20 20 49 6d 70   account..   Imp
0e10: 6c 65 6d 65 6e 74 73 20 50 48 4b 20 66 6f 72 6d  lements PHK form
0e20: 61 74 20 73 75 70 70 6f 72 74 20 28 70 72 65 63  at support (prec
0e30: 65 64 73 20 50 48 41 52 20 70 61 63 6b 61 67 65  eds PHAR package
0e40: 73 29 2c 20 77 68 69 63 68 20 61 6c 72 65 61 64  s), which alread
0e50: 79 0a 20 20 20 70 72 6f 76 69 64 65 20 6d 65 74  y.   provide met
0e60: 61 2d 62 75 6e 64 6c 69 6e 67 20 61 6e 64 20 73  a-bundling and s
0e70: 6f 6d 65 20 61 75 74 6f 6c 6f 61 64 69 6e 67 20  ome autoloading 
0e80: 73 75 70 70 6f 72 74 20 62 79 20 74 68 65 6d 73  support by thems
0e90: 65 6c 76 65 73 2e 0a 0a 20 e2 86 92 20 5b 70 68  elves... ... [ph
0ea0: 70 61 62 5d 28 68 74 74 70 73 3a 2f 2f 67 69 74  pab](https://git
0eb0: 68 75 62 2e 63 6f 6d 2f 74 68 65 73 65 65 72 2f  hub.com/theseer/
0ec0: 41 75 74 6f 6c 6f 61 64 29 20 69 73 20 61 6e 6f  Autoload) is ano
0ed0: 74 68 65 72 20 77 65 6c 6c 2d 64 65 73 69 67 6e  ther well-design
0ee0: 65 64 0a 20 20 20 61 75 74 6f 6c 6f 61 64 20 62  ed.   autoload b
0ef0: 75 69 6c 64 65 72 2e 20 49 74 20 61 6c 73 6f 20  uilder. It also 
0f00: 64 6f 75 62 6c 65 73 20 61 73 20 50 68 61 72 20  doubles as Phar 
0f10: 70 61 63 6b 61 67 69 6e 67 20 74 6f 6f 6c 20 66  packaging tool f
0f20: 6f 72 20 6d 65 72 67 69 6e 67 0a 20 20 20 64 65  or merging.   de
0f30: 70 65 6e 64 65 6e 63 69 65 73 20 69 6e 74 6f 20  pendencies into 
0f40: 64 69 73 74 72 69 62 75 74 61 62 6c 65 20 62 75  distributable bu
0f50: 6e 64 6c 65 73 2e 20 49 74 27 73 20 68 69 67 68  ndles. It's high
0f60: 6c 79 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 20  ly configurable 
0f70: 28 75 6e 6c 69 6b 65 0a 20 20 20 73 68 61 72 65  (unlike.   share
0f80: 64 2e 70 68 61 72 29 2c 20 74 68 65 72 65 66 6f  d.phar), therefo
0f90: 72 65 20 61 6c 6c 6f 77 73 20 66 6f 72 20 6d 6f  re allows for mo
0fa0: 72 65 20 74 61 72 67 65 74 74 65 64 20 72 65 73  re targetted res
0fb0: 75 6c 74 73 2c 20 61 6e 64 20 61 64 64 73 20 6d  ults, and adds m
0fc0: 6f 72 65 0a 20 20 20 72 6f 62 75 73 74 20 50 48  ore.   robust PH
0fd0: 50 20 35 2e 32 20 63 6f 6d 70 61 74 69 62 69 6c  P 5.2 compatibil
0fe0: 69 74 79 2e 0a 20 20 20 49 74 27 73 20 61 6c 73  ity..   It's als
0ff0: 6f 20 50 48 50 20 6c 61 6e 67 75 61 67 65 20 63  o PHP language c
1000: 6f 6d 70 6c 69 61 6e 74 20 70 65 72 20 64 65 66  ompliant per def
1010: 61 75 6c 74 2e 20 28 44 6f 65 73 6e 27 74 20 79  ault. (Doesn't y
1020: 65 74 20 73 63 61 6e 20 77 69 74 68 69 6e 0a 20  et scan within. 
1030: 20 20 70 68 61 72 20 70 61 63 6b 61 67 65 73 20    phar packages 
1040: 69 74 73 65 6c 66 20 68 6f 77 65 76 65 72 2e 29  itself however.)
1050: 0a 0a 20 e2 86 92 20 5b 4f 50 4c 33 2f 50 48 41  .. ... [OPL3/PHA
1060: 52 4c 6f 61 64 65 72 5d 28 68 74 74 70 73 3a 2f  RLoader](https:/
1070: 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 4f 50 4c 2f  /github.com/OPL/
1080: 6f 70 6c 33 2d 61 75 74 6f 6c 6f 61 64 65 72 29  opl3-autoloader)
1090: 20 70 72 6f 76 69 64 65 73 20 73 6f 6d 65 0a 20   provides some. 
10a0: 20 20 50 68 61 72 20 6c 6f 61 64 69 6e 67 20 73    Phar loading s
10b0: 75 70 70 6f 72 74 2c 20 62 75 74 20 62 65 69 6e  upport, but bein
10c0: 67 20 50 53 52 2d 30 20 61 72 74 69 63 6c 65 64  g PSR-0 articled
10d0: 20 66 6f 72 67 6f 73 20 70 72 6f 70 65 72 20 69   forgos proper i
10e0: 64 65 6e 74 69 66 69 65 72 0a 20 20 20 6d 61 70  dentifier.   map
10f0: 70 69 6e 67 2e 0a 0a 0a                          ping....