2019-07-17 20:08:50 +00:00
< ? php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE . txt .
* It is also available through the world - wide - web at this URL :
* http :// framework . zend . com / license / new - bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world - wide - web , please send an email
* to license @ zend . com so we can send you a copy immediately .
*
* @ category Zend
* @ package Zend_Loader
2019-07-17 20:19:00 +00:00
* @ copyright Copyright ( c ) 2005 - 2009 Zend Technologies USA Inc . ( http :// www . zend . com )
2019-07-17 20:08:50 +00:00
* @ license http :// framework . zend . com / license / new - bsd New BSD License
2019-07-17 20:19:00 +00:00
* @ version $Id : Loader . php 16206 2009 - 06 - 21 19 : 15 : 37 Z thomas $
2019-07-17 20:08:50 +00:00
*/
/**
* Static methods for loading classes and files .
*
* @ category Zend
* @ package Zend_Loader
2019-07-17 20:19:00 +00:00
* @ copyright Copyright ( c ) 2005 - 2009 Zend Technologies USA Inc . ( http :// www . zend . com )
2019-07-17 20:08:50 +00:00
* @ license http :// framework . zend . com / license / new - bsd New BSD License
*/
class Zend_Loader
{
/**
* Loads a class from a PHP file . The filename must be formatted
* as " $class .php " .
*
* If $dirs is a string or an array , it will search the directories
* in the order supplied , and attempt to load the first matching file .
*
* If $dirs is null , it will split the class name at underscores to
* generate a path hierarchy ( e . g . , " Zend_Example_Class " will map
* to " Zend/Example/Class.php " ) .
*
* If the file was not found in the $dirs , or if no $dirs were specified ,
* it will attempt to load it from PHP ' s include_path .
*
* @ param string $class - The full class name of a Zend component .
* @ param string | array $dirs - OPTIONAL Either a path or an array of paths
* to search .
* @ return void
* @ throws Zend_Exception
*/
public static function loadClass ( $class , $dirs = null )
{
if ( class_exists ( $class , false ) || interface_exists ( $class , false )) {
return ;
}
if (( null !== $dirs ) && ! is_string ( $dirs ) && ! is_array ( $dirs )) {
require_once 'Zend/Exception.php' ;
throw new Zend_Exception ( 'Directory argument must be a string or an array' );
}
// autodiscover the path from the class name
$file = str_replace ( '_' , DIRECTORY_SEPARATOR , $class ) . '.php' ;
if ( ! empty ( $dirs )) {
// use the autodiscovered path
$dirPath = dirname ( $file );
if ( is_string ( $dirs )) {
$dirs = explode ( PATH_SEPARATOR , $dirs );
}
foreach ( $dirs as $key => $dir ) {
if ( $dir == '.' ) {
$dirs [ $key ] = $dirPath ;
} else {
$dir = rtrim ( $dir , '\\/' );
$dirs [ $key ] = $dir . DIRECTORY_SEPARATOR . $dirPath ;
}
}
$file = basename ( $file );
self :: loadFile ( $file , $dirs , true );
} else {
self :: _securityCheck ( $file );
2019-07-17 20:16:19 +00:00
include $file ;
2019-07-17 20:08:50 +00:00
}
if ( ! class_exists ( $class , false ) && ! interface_exists ( $class , false )) {
require_once 'Zend/Exception.php' ;
throw new Zend_Exception ( " File \" $file\ " does not exist or class \ " $class\ " was not found in the file " );
}
}
/**
* Loads a PHP file . This is a wrapper for PHP ' s include () function .
*
* $filename must be the complete filename , including any
* extension such as " .php " . Note that a security check is performed that
* does not permit extended characters in the filename . This method is
* intended for loading Zend Framework files .
*
* If $dirs is a string or an array , it will search the directories
* in the order supplied , and attempt to load the first matching file .
*
* If the file was not found in the $dirs , or if no $dirs were specified ,
* it will attempt to load it from PHP ' s include_path .
*
* If $once is TRUE , it will use include_once () instead of include () .
*
* @ param string $filename
* @ param string | array $dirs - OPTIONAL either a path or array of paths
* to search .
* @ param boolean $once
* @ return boolean
* @ throws Zend_Exception
*/
public static function loadFile ( $filename , $dirs = null , $once = false )
{
self :: _securityCheck ( $filename );
/**
* Search in provided directories , as well as include_path
*/
$incPath = false ;
if ( ! empty ( $dirs ) && ( is_array ( $dirs ) || is_string ( $dirs ))) {
if ( is_array ( $dirs )) {
$dirs = implode ( PATH_SEPARATOR , $dirs );
}
$incPath = get_include_path ();
set_include_path ( $dirs . PATH_SEPARATOR . $incPath );
}
/**
* Try finding for the plain filename in the include_path .
*/
if ( $once ) {
include_once $filename ;
} else {
include $filename ;
}
/**
* If searching in directories , reset include_path
*/
if ( $incPath ) {
set_include_path ( $incPath );
}
return true ;
}
/**
* Returns TRUE if the $filename is readable , or FALSE otherwise .
* This function uses the PHP include_path , where PHP ' s is_readable ()
* does not .
*
* Note from ZF - 2900 :
* If you use custom error handler , please check whether return value
* from error_reporting () is zero or not .
* At mark of fopen () can not suppress warning if the handler is used .
*
* @ param string $filename
* @ return boolean
*/
public static function isReadable ( $filename )
{
if ( ! $fh = @ fopen ( $filename , 'r' , true )) {
return false ;
}
@ fclose ( $fh );
return true ;
}
/**
* spl_autoload () suitable implementation for supporting class autoloading .
*
* Attach to spl_autoload () using the following :
* < code >
* spl_autoload_register ( array ( 'Zend_Loader' , 'autoload' ));
* </ code >
*
2019-07-17 20:16:19 +00:00
* @ deprecated Since 1.8 . 0
* @ param string $class
2019-07-17 20:08:50 +00:00
* @ return string | false Class name on success ; false on failure
*/
public static function autoload ( $class )
{
2019-07-17 20:16:19 +00:00
trigger_error ( __CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead' , E_USER_NOTICE );
2019-07-17 20:08:50 +00:00
try {
2019-07-17 20:16:19 +00:00
@ self :: loadClass ( $class );
2019-07-17 20:08:50 +00:00
return $class ;
} catch ( Exception $e ) {
return false ;
}
}
/**
* Register { @ link autoload ()} with spl_autoload ()
*
2019-07-17 20:16:19 +00:00
* @ deprecated Since 1.8 . 0
2019-07-17 20:08:50 +00:00
* @ param string $class ( optional )
* @ param boolean $enabled ( optional )
* @ return void
* @ throws Zend_Exception if spl_autoload () is not found
* or if the specified class does not have an autoload () method .
*/
public static function registerAutoload ( $class = 'Zend_Loader' , $enabled = true )
{
2019-07-17 20:16:19 +00:00
trigger_error ( __CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead' , E_USER_NOTICE );
require_once 'Zend/Loader/Autoloader.php' ;
$autoloader = Zend_Loader_Autoloader :: getInstance ();
$autoloader -> setFallbackAutoloader ( true );
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
if ( 'Zend_Loader' != $class ) {
self :: loadClass ( $class );
$methods = get_class_methods ( $class );
if ( ! in_array ( 'autoload' , ( array ) $methods )) {
require_once 'Zend/Exception.php' ;
throw new Zend_Exception ( " The class \" $class\ " does not have an autoload () method " );
}
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
$callback = array ( $class , 'autoload' );
if ( $enabled ) {
$autoloader -> pushAutoloader ( $callback );
} else {
$autoloader -> removeAutoloader ( $callback );
}
2019-07-17 20:08:50 +00:00
}
}
/**
* Ensure that filename does not contain exploits
*
* @ param string $filename
* @ return void
* @ throws Zend_Exception
*/
protected static function _securityCheck ( $filename )
{
/**
* Security check
*/
2019-07-17 20:16:19 +00:00
if ( preg_match ( '/[^a-z0-9\\/\\\\_.:-]/i' , $filename )) {
2019-07-17 20:08:50 +00:00
require_once 'Zend/Exception.php' ;
throw new Zend_Exception ( 'Security check: Illegal character in filename' );
}
}
/**
* Attempt to include () the file .
*
* include () is not prefixed with the @ operator because if
* the file is loaded and contains a parse error , execution
* will halt silently and this is difficult to debug .
*
* Always set display_errors = Off on production servers !
*
* @ param string $filespec
* @ param boolean $once
* @ return boolean
* @ deprecated Since 1.5 . 0 ; use loadFile () instead
*/
protected static function _includeFile ( $filespec , $once = false )
{
if ( $once ) {
return include_once $filespec ;
} else {
return include $filespec ;
}
}
}