diff options
Diffstat (limited to 'system/libraries/Driver.php')
-rw-r--r-- | system/libraries/Driver.php | 136 |
1 files changed, 101 insertions, 35 deletions
diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index d67ee2549..8323e8f01 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -1,4 +1,4 @@ -<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +<?php /** * CodeIgniter * @@ -24,6 +24,7 @@ * @since Version 1.0 * @filesource */ +defined('BASEPATH') OR exit('No direct script access allowed'); /** * CodeIgniter Driver Library Class @@ -54,64 +55,128 @@ class CI_Driver_Library { protected $lib_name; /** + * Get magic method + * * The first time a child is used it won't exist, so we instantiate it * subsequents calls will go straight to the proper child. * - * @param mixed $child - * @return mixed + * @param string Child class name + * @return object Child class */ public function __get($child) { + // Try to load the driver + return $this->load_driver($child); + } + + /** + * Load driver + * + * Separate load_driver call to support explicit driver load by library or user + * + * @param string Driver name (w/o parent prefix) + * @return object Child class + */ + public function load_driver($child) + { + // Get CodeIgniter instance and subclass prefix + $CI = get_instance(); + $prefix = (string) $CI->config->item('subclass_prefix'); + if ( ! isset($this->lib_name)) { - $this->lib_name = get_class($this); + // Get library name without any prefix + $this->lib_name = str_replace(array('CI_', $prefix), '', get_class($this)); } - // The class will be prefixed with the parent lib - $child_class = $this->lib_name.'_'.$child; + // The child will be prefixed with the parent lib + $child_name = $this->lib_name.'_'.$child; - // Remove the CI_ prefix and lowercase - $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); - $driver_name = strtolower(str_replace('CI_', '', $child_class)); + // See if requested child is a valid driver + if ( ! in_array($child, $this->valid_drivers)) + { + // The requested driver isn't valid! + $msg = 'Invalid driver requested: '.$child_name; + log_message('error', $msg); + show_error($msg); + } + + // Get package paths and filename case variations to search + $paths = $CI->load->get_package_paths(TRUE); - if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) + // Is there an extension? + $class_name = $prefix.$child_name; + $found = class_exists($class_name); + if ( ! $found) { - // check and see if the driver is in a separate file - if ( ! class_exists($child_class)) + // Check for subclass file + foreach ($paths as $path) { - // check application path first - foreach (get_instance()->load->get_package_paths(TRUE) as $path) + // Does the file exist? + $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$prefix.$child_name.'.php'; + if (file_exists($file)) { - // loves me some nesting! - foreach (array(ucfirst($driver_name), $driver_name) as $class) + // Yes - require base class from BASEPATH + $basepath = BASEPATH.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php'; + if ( ! file_exists($basepath)) { - $filepath = $path.'libraries/'.$lib_name.'/drivers/'.$class.'.php'; - - if (file_exists($filepath)) - { - include_once $filepath; - break 2; - } + $msg = 'Unable to load the requested class: CI_'.$child_name; + log_message('error', $msg); + show_error($msg); } + + // Include both sources and mark found + include($basepath); + include($file); + $found = TRUE; + break; } + } + } - // it's a valid driver, but the file simply can't be found - if ( ! class_exists($child_class)) + // Do we need to search for the class? + if ( ! $found) + { + // Use standard class name + $class_name = 'CI_'.$child_name; + $found = class_exists($class_name); + if ( ! $found) + { + // Check package paths + foreach ($paths as $path) { - log_message('error', 'Unable to load the requested driver: '.$child_class); - show_error('Unable to load the requested driver: '.$child_class); + // Does the file exist? + $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php'; + if (file_exists($file)) + { + // Include source + include($file); + break; + } } } + } - $obj = new $child_class; - $obj->decorate($this); - $this->$child = $obj; - return $this->$child; + // Did we finally find the class? + if ( ! class_exists($class_name)) + { + if (class_exists($child_name)) + { + $class_name = $child_name; + } + else + { + $msg = 'Unable to load the requested driver: '.$class_name; + log_message('error', $msg); + show_error($msg); + } } - // The requested driver isn't valid! - log_message('error', 'Invalid driver requested: '.$child_class); - show_error('Invalid driver requested: '.$child_class); + // Instantiate, decorate and add child + $obj = new $class_name(); + $obj->decorate($this); + $this->$child = $obj; + return $this->$child; } } @@ -156,7 +221,8 @@ class CI_Driver { /** * Array of methods and properties for the parent class(es) * - * @var array + * @static + * @var array */ protected static $_reflections = array(); |