107 lines
2.5 KiB
PHP
107 lines
2.5 KiB
PHP
<?php
|
|
/**
|
|
* Autoloader for Activitypub.
|
|
*
|
|
* @package Activitypub
|
|
*/
|
|
|
|
namespace Activitypub;
|
|
|
|
/**
|
|
* An Autoloader that respects WordPress's filename standards.
|
|
*/
|
|
class Autoloader {
|
|
|
|
/**
|
|
* Namespace separator.
|
|
*/
|
|
const NS_SEPARATOR = '\\';
|
|
|
|
/**
|
|
* The prefix to compare classes against.
|
|
*
|
|
* @var string
|
|
* @access protected
|
|
*/
|
|
protected $prefix;
|
|
|
|
/**
|
|
* Length of the prefix string.
|
|
*
|
|
* @var int
|
|
* @access protected
|
|
*/
|
|
protected $prefix_length;
|
|
|
|
/**
|
|
* Path to the file to be loaded.
|
|
*
|
|
* @var string
|
|
* @access protected
|
|
*/
|
|
protected $path;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param string $prefix Namespace prefix all classes have in common.
|
|
* @param string $path Path to the files to be loaded.
|
|
*/
|
|
public function __construct( $prefix, $path ) {
|
|
$this->prefix = $prefix;
|
|
$this->prefix_length = \strlen( $prefix );
|
|
$this->path = \rtrim( $path . '/' );
|
|
}
|
|
|
|
/**
|
|
* Registers Autoloader's autoload function.
|
|
*
|
|
* @throws \Exception When autoload_function cannot be registered.
|
|
*
|
|
* @param string $prefix Namespace prefix all classes have in common.
|
|
* @param string $path Path to the files to be loaded.
|
|
*/
|
|
public static function register_path( $prefix, $path ) {
|
|
$loader = new self( $prefix, $path );
|
|
\spl_autoload_register( array( $loader, 'load' ) );
|
|
}
|
|
|
|
/**
|
|
* Loads a class if its namespace starts with `$this->prefix`.
|
|
*
|
|
* @param string $class_name The class to be loaded.
|
|
*/
|
|
public function load( $class_name ) {
|
|
if ( \strpos( $class_name, $this->prefix . self::NS_SEPARATOR ) !== 0 ) {
|
|
return;
|
|
}
|
|
|
|
// Strip prefix from the start (ala PSR-4).
|
|
$class_name = \substr( $class_name, $this->prefix_length + 1 );
|
|
$class_name = \strtolower( $class_name );
|
|
$dir = '';
|
|
|
|
$last_ns_pos = \strripos( $class_name, self::NS_SEPARATOR );
|
|
if ( false !== $last_ns_pos ) {
|
|
$namespace = \substr( $class_name, 0, $last_ns_pos );
|
|
$namespace = \str_replace( '_', '-', $namespace );
|
|
$class_name = \substr( $class_name, $last_ns_pos + 1 );
|
|
$dir = \str_replace( self::NS_SEPARATOR, DIRECTORY_SEPARATOR, $namespace ) . DIRECTORY_SEPARATOR;
|
|
}
|
|
|
|
$path = $this->path . $dir . 'class-' . \str_replace( '_', '-', $class_name ) . '.php';
|
|
|
|
if ( ! \file_exists( $path ) ) {
|
|
$path = $this->path . $dir . 'interface-' . \str_replace( '_', '-', $class_name ) . '.php';
|
|
}
|
|
|
|
if ( ! \file_exists( $path ) ) {
|
|
$path = $this->path . $dir . 'trait-' . \str_replace( '_', '-', $class_name ) . '.php';
|
|
}
|
|
|
|
if ( \file_exists( $path ) ) {
|
|
require_once $path;
|
|
}
|
|
}
|
|
}
|