Skip to content

Instantly share code, notes, and snippets.

@JackNoordhuis
Forked from jwage/SplClassLoader.php
Last active August 12, 2016 07:32
Show Gist options
  • Save JackNoordhuis/21d01019155d8cc0d9c4bf5d715221ee to your computer and use it in GitHub Desktop.
Save JackNoordhuis/21d01019155d8cc0d9c4bf5d715221ee to your computer and use it in GitHub Desktop.
Add MIT license.
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
/**
* SplClassLoader implementation that implements the technical interoperability
* standards for PHP 5.3 namespaces and class names
*
* Improved by Jack Noordhuis (https://twitter.com/JackNoordhuis)
*
* Original gist: https://gist.github.com/jwage/221634
*/
class SplClassLoader {
/** @var string */
private $fileExtension = ".php";
/** @var string */
private $namespace = "";
/** @var string */
private $includePath = "";
/** @var string */
private $namespaceSeparator = "\\";
/**
* Creates a new SplClassLoader that loads classes of the specified namespace.
*
* @param string $ns The namespace to use.
* @param string $includePath
*/
public function __construct($ns = null, $includePath = null) {
$this->namespace = $ns;
$this->includePath = $includePath;
}
/**
* Sets the namespace separator used by classes in the namespace of this class loader.
*
* @param string $sep The separator to use.
*/
public function setNamespaceSeparator($sep) {
$this->namespaceSeparator = $sep;
}
/**
* Gets the namespace separator used by classes in the namespace of this class loader.
*
* @return string
*/
public function getNamespaceSeparator() {
return $this->namespaceSeparator;
}
/**
* Sets the base include path for all class files in the namespace of this class loader.
*
* @param string $includePath
*/
public function setIncludePath($includePath) {
$this->includePath = $includePath;
}
/**
* Gets the base include path for all class files in the namespace of this class loader.
*
* @return string $includePath
*/
public function getIncludePath() {
return $this->includePath;
}
/**
* Sets the file extension of class files in the namespace of this class loader.
*
* @param string $fileExtension
*/
public function setFileExtension($fileExtension) {
$this->fileExtension = $fileExtension;
}
/**
* Gets the file extension of class files in the namespace of this class loader.
*
* @return string $fileExtension
*/
public function getFileExtension() {
return $this->fileExtension;
}
/**
* Installs this class loader on the SPL autoload stack.
*/
public function register() {
spl_autoload_register(array($this, "loadClass"));
}
/**
* Uninstalls this class loader from the SPL auto-loader stack.
*/
public function unregister() {
spl_autoload_unregister(array($this, "loadClass"));
}
/**
* Loads the given class or interface.
*
* @param string $className The name of the class to load.
*
* @return void
*/
public function loadClass($className) {
if($this->namespace == null || $this->namespace . $this->namespaceSeparator === substr($className, 0, strlen($this->namespace . $this->namespaceSeparator))) {
$fileName = "";
$namespace = "";
if(($lastNsPos = strripos($className, $this->namespaceSeparator)) !== false) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace("_", DIRECTORY_SEPARATOR, $className) . $this->fileExtension;
require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : "") . $fileName;
}
}
}
@JackNoordhuis
Copy link
Author

For anyone thats interested, you can find the original gist here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment