JLoader Help to Understand

Discussion in 'Joomla' started by web4, Dec 10, 2009.

  1. #1
    <?php
    /**
    * @version $Id: loader.php 10381 2008-06-01 03:35:53Z pasamio $
    * @package		Joomla.Framework
    * @copyright	Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
    * @license		GNU/GPL, see LICENSE.php
    * Joomla! is free software. This version may have been modified pursuant
    * to the GNU General Public License, and as distributed it includes or
    * is derivative of works licensed under the GNU General Public License or
    * other free or open source software licenses.
    * See COPYRIGHT.php for copyright notices and details.
    */
    
    if(!defined('DS')) {
    	define( 'DS', DIRECTORY_SEPARATOR );
    }
    
    /**
     * @package		Joomla.Framework
     */
    class JLoader
    {
    	 /**
    	 * Loads a class from specified directories.
    	 *
    	 * @param string $name	The class name to look for ( dot notation ).
    	 * @param string $base	Search this directory for the class.
    	 * @param string $key	String used as a prefix to denote the full path of the file ( dot notation ).
    	 * @return void
    	 * @since 1.5
    	 */
    	function import( $filePath, $base = null, $key = 'libraries.' )
    	{
    		static $paths;
    		
    		if (!isset($paths)) {
    			$paths = array();
    		}
    		$keyPath = $key ? $key . $filePath : $filePath;
    		
    		if (!isset($paths[$keyPath]))
    		{
    			if ( ! $base ) {
    				$base =  dirname( __FILE__ ); 
    			}
    
    			$parts = explode( '.', $filePath );
    
    			$classname = array_pop( $parts );
    			switch($classname)
    			{
    				case 'helper' :
    					$classname = ucfirst(array_pop( $parts )).ucfirst($classname);
    					break;
    
    				default :
    					$classname = ucfirst($classname);
    					break;
    			}
    
    			$path  = str_replace( '.', DS, $filePath );
                
    			if (strpos($filePath, 'joomla') === 0)
    			{
    				/*
    				 * If we are loading a joomla class prepend the classname with a
    				 * capital J.
    				 */    
    				$classname	= 'J'.$classname; 
    				$classes	= JLoader::register($classname, $base.DS.$path.'.php');
    				$rs			= isset($classes[strtolower($classname)]);
    			}
    			else
    			{ 
    				/*
    				 * If it is not in the joomla namespace then we have no idea if
    				 * it uses our pattern for class names/files so just include.
    				 */   
    				$rs   = include($base.DS.$path.'.php');
    			}
    
    			$paths[$keyPath] = $rs; 
    		}
    
    		return $paths[$keyPath];
    	}
    
    	/**
    	 * Add a class to autoload
    	 *
    	 * @param	string $classname	The class name
    	 * @param	string $file		Full path to the file that holds the class
    	 * @return	array|boolean  		Array of classes
    	 * @since 	1.5
    	 */               
    	function & register ($class = null, $file = null)
    	{   
    		static $classes;
    
    		if(!isset($classes)) {
    			$classes    = array();
    		}
           
    		if($class && is_file($file))
    		{  
    			// Force to lower case.
    			$class = strtolower($class); 
    			$classes[$class] = $file; 
    
    			// In php4 we load the class immediately.
    			if((version_compare( phpversion(), '5.0' ) < 0)) { 
    				JLoader::load($class);
    			}
    
    		} 
            
    		return $classes;
    	}
    
    
    	/**
    	 * Load the file for a class
    	 *
    	 * @access  public
    	 * @param   string  $class  The class that will be loaded
    	 * @return  boolean True on success
    	 * @since   1.5
    	 */            
    	function load( $class )
    	{ 
    		$class = strtolower($class); //force to lower case
    
    		if (class_exists($class)) {
    			  return;
    		}
    
    		$classes = JLoader::register();
    		if(array_key_exists( strtolower($class), $classes)) {
    			include($classes[$class]);
    			return true;
    		}
    		return false;
    	} 
    }
    
    
    /**
     * When calling a class that hasn't been defined, __autoload will attempt to
     * include the correct file for that class.
     *
     * This function get's called by PHP. Never call this function yourself.
     *
     * @param 	string 	$class
     * @access 	public
     * @return  boolean
     * @since   1.5
     */          
    function __autoload($class)
    {
    	if(JLoader::load($class)) {
    		return true;
    	}
    	return false;
    }
    
    /**
     * Global application exit.
     *
     * This function provides a single exit point for the framework.
     *
     * @param mixed Exit code or string. Defaults to zero.
     */          
    function jexit($message = 0) {
        exit($message);
    }
    
    /**           
     * Intelligent file importer
     *
     * @access public
     * @param string $path A dot syntax path
     * @since 1.5
     */          
    function jimport( $path ) { 
    	return JLoader::import($path);
    }
    
    Code (markup):
    i have a file new.php
    then i use that code....in new.php i wrote the ff lines

    
    <?php
    
    include("..\Joomla\libraries\loader.php");
    
    JLoader::import( 'joomla.base.object'          );
    
    
    ?>
    
    Code (markup):
    then My question is how the file is being loaded with that class?? because 1st it would enter to the import function then it would test if (strpos($filePath, 'joomla') === 0) if it is true then it would also be pass to register function then the register function test if if((version_compare( phpversion(), '5.0' ) < 0)) if it is true then it should load the file...but my question is my phpversion is 5.0.4 then still it's loads the file how could it be?
     
    web4, Dec 10, 2009 IP