<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'en',
  ),
  'this' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Autoloading Classes',
    2 => 'Autoloading Classes',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classes and Objects',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.constants.php',
    1 => 'Class Constants',
  ),
  'next' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'Constructors and Destructors',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    'path' => 'language/oop5/autoload.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.autoload" class="sect1">
  <h2 class="title">Autoloading Classes</h2>
  <p class="para">
   Many developers writing object-oriented applications create
   one PHP source file per class definition. One of the biggest
   annoyances is having to write a long list of needed includes
   at the beginning of each script (one for each class).
  </p>
  <p class="para">
   The <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> function registers any number of
   autoloaders, enabling for classes and interfaces to be automatically loaded
   if they are currently not defined. By registering autoloaders, PHP is given
   a last chance to load the class or interface before it fails with an error.
  </p>
  <p class="para">
   Any class-like construct may be autoloaded the same way. That includes classes,
   interfaces, traits, and enumerations.
  </p>
  <div class="caution"><strong class="caution">Caution</strong>
   <p class="para">
    Prior to PHP 8.0.0, it was possible to use <span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span>
    to autoload classes and interfaces. However, it is a less flexible
    alternative to <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> and
    <span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span> is deprecated as of PHP 7.2.0, and removed
    as of PHP 8.0.0.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> may be called multiple times in order
    to register multiple autoloaders. Throwing an exception from an autoload function,
    however, will interrupt that process and not allow further autoload functions to
    run. For that reason, throwing exceptions from an autoload function is strongly
    discouraged.
   </p>
  </p></blockquote>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Example #1 Autoload example</strong></p>
    <div class="example-contents"><p>
     This example attempts to load the classes <code class="literal">MyClass1</code>
     and <code class="literal">MyClass2</code> from the files <var class="filename">MyClass1.php</var>
     and <var class="filename">MyClass2.php</var> respectively.
    </p></div>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />spl_autoload_register</span><span style="color: #007700">(function (</span><span style="color: #0000BB">$class_name</span><span style="color: #007700">) {<br />    include </span><span style="color: #0000BB">$class_name </span><span style="color: #007700">. </span><span style="color: #DD0000">'.php'</span><span style="color: #007700">;<br />});<br /><br /></span><span style="color: #0000BB">$obj  </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">(); <br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>Example #2 Autoload other example</strong></p>
    <div class="example-contents"><p>
     This example attempts to load the interface <code class="literal">ITest</code>.
    </p></div>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />spl_autoload_register</span><span style="color: #007700">(function (</span><span style="color: #0000BB">$name</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">);<br />});<br /><br />class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">implements </span><span style="color: #0000BB">ITest </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #FF8000">/*<br />string(5) "ITest"<br /><br />Fatal error: Interface 'ITest' not found in ...<br />*/<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-3">
    <p><strong>Example #3 Using Composer&#039;s autoloader</strong></p>
    <div class="example-contents"><p>
     <a href="https://getcomposer.org/" class="link external">&raquo;&nbsp;Composer</a> generates a <code class="literal">vendor/autoload.php</code>
     which is set up to automatically load packages that are being managed
     by Composer. By including this file, those packages can be used without
     any additional work.
    </p></div>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">require </span><span style="color: #0000BB">__DIR__ </span><span style="color: #007700">. </span><span style="color: #DD0000">'/vendor/autoload.php'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$uuid </span><span style="color: #007700">= </span><span style="color: #0000BB">Ramsey\Uuid\Uuid</span><span style="color: #007700">::</span><span style="color: #0000BB">uuid7</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"Generated new UUID -&gt; "</span><span style="color: #007700">, </span><span style="color: #0000BB">$uuid</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">toString</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>

  <div class="simplesect">
   <h3 class="title">See Also</h3>
   <p class="para">
    <ul class="simplelist">
     <li><span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span></li>
     <li><a href="var.configuration.php#ini.unserialize-callback-func" class="link">unserialize_callback_func</a></li>
     <li><a href="var.configuration.php#ini.unserialize-max-depth" class="link">unserialize_max_depth</a></li>
     <li><span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span></li>
     <li><span class="function"><a href="function.spl-autoload.php" class="function">spl_autoload()</a></span></li>
     <li><span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span></li>
    </ul>
   </p>
  </div>

 </div><?php manual_footer($setup); ?>