229 行
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			229 行
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * CodeIgniter
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * An open source application development framework for PHP 5.1.6 or newer
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package		CodeIgniter
							 | 
						||
| 
								 | 
							
								 * @author		EllisLab Dev Team
							 | 
						||
| 
								 | 
							
								 * @copyright	Copyright (c) 2006 - 2011, EllisLab, Inc.
							 | 
						||
| 
								 | 
							
								 * @license		http://codeigniter.com/user_guide/license.html
							 | 
						||
| 
								 | 
							
								 * @link		http://codeigniter.com
							 | 
						||
| 
								 | 
							
								 * @since		Version 1.0
							 | 
						||
| 
								 | 
							
								 * @filesource
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * CodeIgniter Driver Library Class
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This class enables you to create "Driver" libraries that add runtime ability
							 | 
						||
| 
								 | 
							
								 * to extend the capabilities of a class via additional driver objects
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package		CodeIgniter
							 | 
						||
| 
								 | 
							
								 * @subpackage	Libraries
							 | 
						||
| 
								 | 
							
								 * @category	Libraries
							 | 
						||
| 
								 | 
							
								 * @author		EllisLab Dev Team
							 | 
						||
| 
								 | 
							
								 * @link
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class CI_Driver_Library {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									protected $valid_drivers	= array();
							 | 
						||
| 
								 | 
							
									protected static $lib_name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// The first time a child is used it won't exist, so we instantiate it
							 | 
						||
| 
								 | 
							
									// subsequents calls will go straight to the proper child.
							 | 
						||
| 
								 | 
							
									function __get($child)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if ( ! isset($this->lib_name))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$this->lib_name = get_class($this);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// The class will be prefixed with the parent lib
							 | 
						||
| 
								 | 
							
										$child_class = $this->lib_name.'_'.$child;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (in_array(strtolower($child_class), array_map('strtolower', $this->valid_drivers)))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// check and see if the driver is in a separate file
							 | 
						||
| 
								 | 
							
											if ( ! class_exists($child_class))
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												// check application path first
							 | 
						||
| 
								 | 
							
												foreach (array(APPPATH, BASEPATH) as $path)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													// and check for case sensitivity of both the parent and child libs
							 | 
						||
| 
								 | 
							
													foreach (array(ucfirst($this->lib_name), strtolower($this->lib_name)) as $lib)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														// loves me some nesting!
							 | 
						||
| 
								 | 
							
														foreach (array(ucfirst($child_class), strtolower($child_class)) as $class)
							 | 
						||
| 
								 | 
							
														{
							 | 
						||
| 
								 | 
							
															$filepath = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_class.EXT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															if (file_exists($filepath))
							 | 
						||
| 
								 | 
							
															{
							 | 
						||
| 
								 | 
							
																include_once $filepath;
							 | 
						||
| 
								 | 
							
																break;
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// it's a valid driver, but the file simply can't be found
							 | 
						||
| 
								 | 
							
												if ( ! class_exists($child_class))
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													log_message('error', "Unable to load the requested driver: ".$child_class);
							 | 
						||
| 
								 | 
							
													show_error("Unable to load the requested driver: ".$child_class);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											$obj = new $child_class;
							 | 
						||
| 
								 | 
							
											$obj->decorate($this);
							 | 
						||
| 
								 | 
							
											$this->$child = $obj;
							 | 
						||
| 
								 | 
							
											return $this->$child;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// The requested driver isn't valid!
							 | 
						||
| 
								 | 
							
										log_message('error', "Invalid driver requested: ".$child_class);
							 | 
						||
| 
								 | 
							
										show_error("Invalid driver requested: ".$child_class);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								// END CI_Driver_Library CLASS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * CodeIgniter Driver Class
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This class enables you to create drivers for a Library based on the Driver Library.
							 | 
						||
| 
								 | 
							
								 * It handles the drivers' access to the parent library
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package		CodeIgniter
							 | 
						||
| 
								 | 
							
								 * @subpackage	Libraries
							 | 
						||
| 
								 | 
							
								 * @category	Libraries
							 | 
						||
| 
								 | 
							
								 * @author		EllisLab Dev Team
							 | 
						||
| 
								 | 
							
								 * @link
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class CI_Driver {
							 | 
						||
| 
								 | 
							
									protected $parent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private $methods = array();
							 | 
						||
| 
								 | 
							
									private $properties = array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private static $reflections = array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Decorate
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * Decorates the child with the parent driver lib's methods and properties
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param	object
							 | 
						||
| 
								 | 
							
									 * @return	void
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function decorate($parent)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$this->parent = $parent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Lock down attributes to what is defined in the class
							 | 
						||
| 
								 | 
							
										// and speed up references in magic methods
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$class_name = get_class($parent);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( ! isset(self::$reflections[$class_name]))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$r = new ReflectionObject($parent);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											foreach ($r->getMethods() as $method)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												if ($method->isPublic())
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													$this->methods[] = $method->getName();
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											foreach ($r->getProperties() as $prop)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												if ($prop->isPublic())
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													$this->properties[] = $prop->getName();
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											self::$reflections[$class_name] = array($this->methods, $this->properties);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											list($this->methods, $this->properties) = self::$reflections[$class_name];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * __call magic method
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * Handles access to the parent driver library's methods
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @access	public
							 | 
						||
| 
								 | 
							
									 * @param	string
							 | 
						||
| 
								 | 
							
									 * @param	array
							 | 
						||
| 
								 | 
							
									 * @return	mixed
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function __call($method, $args = array())
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (in_array($method, $this->methods))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return call_user_func_array(array($this->parent, $method), $args);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$trace = debug_backtrace();
							 | 
						||
| 
								 | 
							
										_exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']);
							 | 
						||
| 
								 | 
							
										exit;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * __get magic method
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * Handles reading of the parent driver library's properties
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param	string
							 | 
						||
| 
								 | 
							
									 * @return	mixed
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function __get($var)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (in_array($var, $this->properties))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return $this->parent->$var;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * __set magic method
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * Handles writing to the parent driver library's properties
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param	string
							 | 
						||
| 
								 | 
							
									 * @param	array
							 | 
						||
| 
								 | 
							
									 * @return	mixed
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function __set($var, $val)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (in_array($var, $this->properties))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$this->parent->$var = $val;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								// END CI_Driver CLASS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* End of file Driver.php */
							 | 
						||
| 
								 | 
							
								/* Location: ./system/libraries/Driver.php */
							 |