亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

CI框架裝載器Loader.php源碼分析

2020-03-22 20:12:07
字體:
供稿:網(wǎng)友
顧名思義,裝載器就是加載元素的,使用CI時,經(jīng)常加載的有:$this- load- library()
$this- load- view()
$this- load- model()
$this- load- database()
$this- load- helper()
$this- load- config()
$this- load- add_package_path()復(fù)制代碼 代碼如下:
/**
* Loader Class
*
* 用戶加載views和files,常見的函數(shù)有model(),view(),library(),helper()
*
* Controller的好助手,$this- load =& load_html' target='_blank'>class('Loader', 'core');,加載了loader,Controller就無比強大了
*/
class CI_Loader {
protected $_ci_ob_level;
protected $_ci_view_paths= array();
protected $_ci_library_paths= array();
protected $_ci_model_paths= array();
protected $_ci_helper_paths= array();
protected $_base_classes= array(); // Set by the controller class
protected $_ci_cached_vars= array();
protected $_ci_classes= array();
protected $_ci_loaded_files= array();

protected $_ci_models= array();
protected $_ci_helpers= array();
protected $_ci_varmap= array('unit_test' = 'unit',
'user_agent' = 'agent');
public function __construct()
{
//獲取緩沖嵌套級別
$this- _ci_ob_level = ob_get_level();
//library路徑
$this- _ci_library_paths = array(APPPATH, BASEPATH);
//helper路徑
$this- _ci_helper_paths = array(APPPATH, BASEPATH);
//model路徑
$this- _ci_model_paths = array(APPPATH);
//view路徑
$this- _ci_view_paths = array(APPPATH.'views/'= TRUE);
log_message('debug', "Loader Class Initialized");
}
// --------------------------------------------------------------------
/**
* 初始化Loader
*
*/
public function initialize()
{
$this- _ci_classes = array();
$this- _ci_loaded_files = array();
$this- _ci_models = array();
//將is_loaded(common中記錄加載核心類函數(shù))加載的核心類交給_base_classes
$this- _base_classes =& is_loaded();
//加載autoload.php配置中文件
$this- _ci_autoloader();
return $this;
}
// --------------------------------------------------------------------
/**
* 檢測類是否加載
*/
public function is_loaded($class)
{
if (isset($this- _ci_classes[$class]))
{
return $this- _ci_classes[$class];
}
return FALSE;
}
// --------------------------------------------------------------------
/**
* 加載Class
*/
public function library($library = '', $params = NULL, $object_name = NULL)
{
if (is_array($library))
{
foreach ($library as $class)
{
$this- library($class, $params);
}
return;
}
//如果$library為空或者已經(jīng)加載。。。
if ($library == '' OR isset($this- _base_classes[$library]))
{
return FALSE;
}
if ( ! is_null($params) && ! is_array($params))
{
$params = NULL;
}
$this- _ci_load_class($library, $params, $object_name);
}
// --------------------------------------------------------------------
/**
* 加載和實例化model
*/
public function model($model, $name = '', $db_conn = FALSE)
{
//CI支持?jǐn)?shù)組加載多個model
if (is_array($model))
{
foreach ($model as $babe)
{
$this- model($babe);
}
return;
}
if ($model == '')
{
return;
}
$path = '';
// 是否存在子目錄
if (($last_slash = strrpos($model, '/')) !== FALSE)
{
// The path is in front of the last slash
$path = substr($model, 0, $last_slash + 1);
// And the model name behind it
$model = substr($model, $last_slash + 1);
}
if ($name == '')
{
$name = $model;
}
if (in_array($name, $this- _ci_models, TRUE))
{
return;
}
$CI =& get_instance();
if (isset($CI- $name))
{
show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
}
$model = strtolower($model); //model文件名全小寫
foreach ($this- _ci_model_paths as $mod_path)
{
if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
{
continue;
}
if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
{
if ($db_conn === TRUE)
{
$db_conn = '';
}
$CI- load- database($db_conn, FALSE, TRUE);
}
if ( ! class_exists('CI_Model'))
{
load_class('Model', 'core');
}
require_once($mod_path.'models/'.$path.$model.'.php');
$model = ucfirst($model);
$CI- $name = new $model();
//保存在Loader::_ci_models中,以后可以用它來判斷某個model是否已經(jīng)加載過。
$this- _ci_models[] = $name;
return;
}
// couldn't find the model
show_error('Unable to locate the model you have specified: '.$model);
}
// --------------------------------------------------------------------
/**
* 數(shù)據(jù)庫Loader
*/
public function database($params = '', $return = FALSE, $active_record = NULL)
{
// Grab the super object
$CI =& get_instance();
// 是否需要加載db
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI- db) AND is_object($CI- db))
{
return FALSE;
}
require_once(BASEPATH.'database/DB.php');
if ($return === TRUE)
{
return DB($params, $active_record);
}
// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI- db = '';
// Load the DB class
$CI- db =& DB($params, $active_record);
}
// --------------------------------------------------------------------
/**
* 加載數(shù)據(jù)庫工具類
*/
public function dbutil()
{
if ( ! class_exists('CI_DB'))
{
$this- database();
}
$CI =& get_instance();
// for backwards compatibility, load dbforge so we can extend dbutils off it
// this use is deprecated and strongly discouraged
$CI- load- dbforge();
require_once(BASEPATH.'database/DB_utility.php');
require_once(BASEPATH.'database/drivers/'.$CI- db- dbdriver.'/'.$CI- db- dbdriver.'_utility.php');
$class = 'CI_DB_'.$CI- db- dbdriver.'_utility';
$CI- dbutil = new $class();
}
// --------------------------------------------------------------------
/**
* Load the Database Forge Class
*
* @returnstring
*/
public function dbforge()
{
if ( ! class_exists('CI_DB'))
{
$this- database();
}
$CI =& get_instance();
require_once(BASEPATH.'database/DB_forge.php');
require_once(BASEPATH.'database/drivers/'.$CI- db- dbdriver.'/'.$CI- db- dbdriver.'_forge.php');
$class = 'CI_DB_'.$CI- db- dbdriver.'_forge';
$CI- dbforge = new $class();
}
// --------------------------------------------------------------------
/**
* 加載視圖文件
*/
public function view($view, $vars = array(), $return = FALSE)
{
return $this- _ci_load(array('_ci_view' = $view, '_ci_vars' = $this- _ci_object_to_array($vars), '_ci_return' = $return));
}
// --------------------------------------------------------------------
/**
* 加載普通文件
*/
public function file($path, $return = FALSE)
{
return $this- _ci_load(array('_ci_path' = $path, '_ci_return' = $return));
}
// --------------------------------------------------------------------
/**
* 設(shè)置變量
*
* Once variables are set they become available within
* the controller class and its "view" files.
*
*/
public function vars($vars = array(), $val = '')
{
if ($val != '' AND is_string($vars))
{
$vars = array($vars = $val);
}
$vars = $this- _ci_object_to_array($vars);
if (is_array($vars) AND count($vars) 0)
{
foreach ($vars as $key = $val)
{
$this- _ci_cached_vars[$key] = $val;
}
}
}
// --------------------------------------------------------------------
/**
* 檢查并獲取變量
*/
public function get_var($key)
{
return isset($this- _ci_cached_vars[$key]) $this- _ci_cached_vars[$key] : NULL;
}
// --------------------------------------------------------------------
/**
* 加載helper
*/
public function helper($helpers = array())
{
foreach ($this- _ci_prep_filename($helpers, '_helper') as $helper)
{
if (isset($this- _ci_helpers[$helper]))
{
continue;
}
$ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php';
// 如果是擴(kuò)展helper的話
if (file_exists($ext_helper))
{
$base_helper = BASEPATH.'helpers/'.$helper.'.php';
if ( ! file_exists($base_helper))
{
show_error('Unable to load the requested file: helpers/'.$helper.'.php');
}
include_once($ext_helper);
include_once($base_helper);
$this- _ci_helpers[$helper] = TRUE;
log_message('debug', 'Helper loaded: '.$helper);
continue;
}
// 如果不是擴(kuò)展helper,helper路徑中加載helper
foreach ($this- _ci_helper_paths as $path)
{
if (file_exists($path.'helpers/'.$helper.'.php'))
{
include_once($path.'helpers/'.$helper.'.php');
$this- _ci_helpers[$helper] = TRUE;
log_message('debug', 'Helper loaded: '.$helper);
break;
}
}
// 如果該helper還沒加載成功的話,說明加載helper失敗
if ( ! isset($this- _ci_helpers[$helper]))
{
show_error('Unable to load the requested file: helpers/'.$helper.'.php');
}
}
}
// --------------------------------------------------------------------
/**
* 可以看到helpers調(diào)用也是上面的helper,只是helpers的別名而已
*/
public function helpers($helpers = array())
{
$this- helper($helpers);
}
// --------------------------------------------------------------------
/**
* 加載language文件
*/
public function language($file = array(), $lang = '')
{
$CI =& get_instance();
if ( ! is_array($file))
{
$file = array($file);
}
foreach ($file as $langfile)
{
$CI- lang- load($langfile, $lang);
}
}
// --------------------------------------------------------------------
/**
* 加載配置文件
*/
public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
{
$CI =& get_instance();
$CI- config- load($file, $use_sections, $fail_gracefully);
}
// --------------------------------------------------------------------
/**
* Driver
*
* 加載 driver library
*/
public function driver($library = '', $params = NULL, $object_name = NULL)
{
if ( ! class_exists('CI_Driver_Library'))
{
// we aren't instantiating an object here, that'll be done by the Library itself
require BASEPATH.'libraries/Driver.php';
}
if ($library == '')
{
return FALSE;
}
// We can save the loader some time since Drivers will *always* be in a subfolder,
// and typically identically named to the library
if ( ! strpos($library, '/'))
{
$library = ucfirst($library).'/'.$library;
}
return $this- library($library, $params, $object_name);
}
// --------------------------------------------------------------------
/**
* 添加 Package 路徑
*
* 把package路徑添加到庫,模型,助手,配置路徑
*/
public function add_package_path($path, $view_cascade=TRUE)
{
$path = rtrim($path, '/').'/';
array_unshift($this- _ci_library_paths, $path);
array_unshift($this- _ci_model_paths, $path);
array_unshift($this- _ci_helper_paths, $path);
$this- _ci_view_paths = array($path.'views/' = $view_cascade) + $this- _ci_view_paths;
$config =& $this- _ci_get_component('config');
array_unshift($config- _config_paths, $path);
}
// --------------------------------------------------------------------
/**
* 獲取Package Paths,默認(rèn)不包含BASEPATH
*/
public function get_package_paths($include_base = FALSE)
{
return $include_base === TRUE $this- _ci_library_paths : $this- _ci_model_paths;
}
// --------------------------------------------------------------------
/**
* 剔除Package Path
*
* Remove a path from the library, model, and helper path arrays if it exists
* If no path is provided, the most recently added path is removed.
*
*/
public function remove_package_path($path = '', $remove_config_path = TRUE)
{
$config =& $this- _ci_get_component('config');
if ($path == '')
{
$void = array_shift($this- _ci_library_paths);
$void = array_shift($this- _ci_model_paths);
$void = array_shift($this- _ci_helper_paths);
$void = array_shift($this- _ci_view_paths);
$void = array_shift($config- _config_paths);
}
else
{
$path = rtrim($path, '/').'/';
foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
{
if (($key = array_search($path, $this- {$var})) !== FALSE)
{
unset($this- {$var}[$key]);
}
}
if (isset($this- _ci_view_paths[$path.'views/']))
{
unset($this- _ci_view_paths[$path.'views/']);
}
if (($key = array_search($path, $config- _config_paths)) !== FALSE)
{
unset($config- _config_paths[$key]);
}
}
// 保證應(yīng)用默認(rèn)的路徑依然存在
$this- _ci_library_paths = array_unique(array_merge($this- _ci_library_paths, array(APPPATH, BASEPATH)));
$this- _ci_helper_paths = array_unique(array_merge($this- _ci_helper_paths, array(APPPATH, BASEPATH)));
$this- _ci_model_paths = array_unique(array_merge($this- _ci_model_paths, array(APPPATH)));
$this- _ci_view_paths = array_merge($this- _ci_view_paths, array(APPPATH.'views/' = TRUE));
$config- _config_paths = array_unique(array_merge($config- _config_paths, array(APPPATH)));
}
// --------------------------------------------------------------------
/**
* Loader
*
* This function is used to load views and files.
* Variables are prefixed with _ci_ to avoid symbol collision with
* variables made available to view files
*
* @paramarray
* @returnvoid
*/
protected function _ci_load($_ci_data)
{
// Set the default data variables
foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
{
$$_ci_val = ( ! isset($_ci_data[$_ci_val])) FALSE : $_ci_data[$_ci_val];
}
$file_exists = FALSE;
//如果$_ci_path不為空,則說明當(dāng)前要加載普通文件。Loader::file才會有path
if ($_ci_path != '')
{
$_ci_x = explode('/', $_ci_path);
$_ci_file = end($_ci_x);
}
else
{
$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
$_ci_file = ($_ci_ext == '') $_ci_view.'.php' : $_ci_view;
foreach ($this- _ci_view_paths as $view_file = $cascade)
{
if (file_exists($view_file.$_ci_file))
{
$_ci_path = $view_file.$_ci_file;
$file_exists = TRUE;
break;
}
if ( ! $cascade)
{
break;
}
}
}
//view文件不存在則會報錯
if ( ! $file_exists && ! file_exists($_ci_path))
{
show_error('Unable to load the requested file: '.$_ci_file);
}
// 把CI的所有屬性都傳遞給loader,view中$this指的是loader
$_ci_CI =& get_instance();
foreach (get_object_vars($_ci_CI) as $_ci_key = $_ci_var)
{
if ( ! isset($this- $_ci_key))
{
$this- $_ci_key =& $_ci_CI- $_ci_key;
}
}
/*
* Extract and cache variables
*
* You can either set variables using the dedicated $this- load_vars()
* function or via the second parameter of this function. We'll merge
* the two types and cache them so that views that are embedded within
* other views can have access to these variables.
*/
if (is_array($_ci_vars))
{
$this- _ci_cached_vars = array_merge($this- _ci_cached_vars, $_ci_vars);
}
extract($this- _ci_cached_vars);
/*
* 將視圖內(nèi)容放到緩存區(qū)
*
*/
ob_start();
// 支持短標(biāo)簽
if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
{
echo eval(' '.preg_replace("/;*/s*/ /", "; ", str_replace(' =', ' php echo ', file_get_contents($_ci_path))));
}
else
{
include($_ci_path); // include() vs include_once() allows for multiple views with the same name
}
log_message('debug', 'File loaded: '.$_ci_path);
// 是否直接返回view數(shù)據(jù)
if ($_ci_return === TRUE)
{
$buffer = ob_get_contents();
@ob_end_clean();
return $buffer;
}
//當(dāng)前這個視圖文件是被另一個視圖文件通過$this- view()方法引入,即視圖文件嵌入視圖文件
if (ob_get_level() $this- _ci_ob_level + 1)
{
ob_end_flush();
}
else
{ ////把緩沖區(qū)的內(nèi)容交給Output組件并清空關(guān)閉緩沖區(qū)。
$_ci_CI- output- append_output(ob_get_contents());
@ob_end_clean();
}
}
// --------------------------------------------------------------------
/**
* 加載類
*/
protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
{
// 去掉.php和兩端的/獲取的$class就是類名或目錄名+類名
$class = str_replace('.php', '', trim($class, '/'));
// CI允許dir/filename方式
$subdir = '';
if (($last_slash = strrpos($class, '/')) !== FALSE)
{
// 目錄
$subdir = substr($class, 0, $last_slash + 1);
// 文件名
$class = substr($class, $last_slash + 1);
}
// 允許加載的類名首字母大寫或全小寫
foreach (array(ucfirst($class), strtolower($class)) as $class)
{
$subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';
// 是否是擴(kuò)展類
if (file_exists($subclass))
{
$baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php';
if ( ! file_exists($baseclass))
{
log_message('error', "Unable to load the requested class: ".$class);
show_error("Unable to load the requested class: ".$class);
}
// Safety: Was the class already loaded by a previous call
if (in_array($subclass, $this- _ci_loaded_files))
{
// Before we deem this to be a duplicate request, let's see
// if a custom object name is being supplied. If so, we'll
// return a new instance of the object
if ( ! is_null($object_name))
{
$CI =& get_instance();
if ( ! isset($CI- $object_name))
{
return $this- _ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
}
}
$is_duplicate = TRUE;
log_message('debug', $class." class already loaded. Second attempt ignored.");
return;
}
include_once($baseclass);
include_once($subclass);
$this- _ci_loaded_files[] = $subclass;
//實例化類
return $this- _ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
}
// 如果不是擴(kuò)展,和上面類似
$is_duplicate = FALSE;
foreach ($this- _ci_library_paths as $path)
{
$filepath = $path.'libraries/'.$subdir.$class.'.php';
// Does the file exist No Bummer...
if ( ! file_exists($filepath))
{
continue;
}
// Safety: Was the class already loaded by a previous call
if (in_array($filepath, $this- _ci_loaded_files))
{
// Before we deem this to be a duplicate request, let's see
// if a custom object name is being supplied. If so, we'll
// return a new instance of the object
if ( ! is_null($object_name))
{
$CI =& get_instance();
if ( ! isset($CI- $object_name))
{
return $this- _ci_init_class($class, '', $params, $object_name);
}
}
$is_duplicate = TRUE;
log_message('debug', $class." class already loaded. Second attempt ignored.");
return;
}
include_once($filepath);
$this- _ci_loaded_files[] = $filepath;
return $this- _ci_init_class($class, '', $params, $object_name);
}
} // END FOREACH
// 如果還沒有找到該class,最后的嘗試是該class會不會在同名的子目錄下
if ($subdir == '')
{
$path = strtolower($class).'/'.$class;
return $this- _ci_load_class($path, $params);
}
// 加載失敗,報錯
if ($is_duplicate == FALSE)
{
log_message('error', "Unable to load the requested class: ".$class);
show_error("Unable to load the requested class: ".$class);
}
}
// --------------------------------------------------------------------
/**
* 實例化已經(jīng)加載的類
*/
protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
{
// 是否有類的配置信息
if ($config === NULL)
{
// Fetch the config paths containing any package paths
$config_component = $this- _ci_get_component('config');
if (is_array($config_component- _config_paths))
{
// Break on the first found file, thus package files
// are not overridden by default paths
foreach ($config_component- _config_paths as $path)
{
// We test for both uppercase and lowercase, for servers that
// are case-sensitive with regard to file names. Check for environment
// first, global next
if (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
{
include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');
break;
}
elseif (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
{
include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');
break;
}
elseif (file_exists($path .'config/'.strtolower($class).'.php'))
{
include($path .'config/'.strtolower($class).'.php');
break;
}
elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php'))
{
include($path .'config/'.ucfirst(strtolower($class)).'.php');
break;
}
}
}
}
if ($prefix == '')
{ //system下library
if (class_exists('CI_'.$class))
{
$name = 'CI_'.$class;
}
elseif (class_exists(config_item('subclass_prefix').$class))
{ //擴(kuò)展library
$name = config_item('subclass_prefix').$class;
}
else
{
$name = $class;
}
}
else
{
$name = $prefix.$class;
}
// Is the class name valid
if ( ! class_exists($name))
{
log_message('error', "Non-existent class: ".$name);
show_error("Non-existent class: ".$class);
}
// Set the variable name we will assign the class to
// Was a custom class name supplied If so we'll use it
$class = strtolower($class);
if (is_null($object_name))
{
$classvar = ( ! isset($this- _ci_varmap[$class])) $class : $this- _ci_varmap[$class];
}
else
{
$classvar = $object_name;
}
// Save the class name and object name
$this- _ci_classes[$class] = $classvar;
// 將初始化的類的實例給CI超級句柄
$CI =& get_instance();
if ($config !== NULL)
{
$CI- $classvar = new $name($config);
}
else
{
$CI- $classvar = new $name;
}
}
// --------------------------------------------------------------------
/**
* 自動加載器
*
* autoload.php配置的自動加載文件有:
* | 1. Packages
| 2. Libraries
| 3. Helper files
| 4. Custom config files
| 5. Language files
| 6. Models
*/
private function _ci_autoloader()
{
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
{
include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
}
else
{
include(APPPATH.'config/autoload.php');
}
if ( ! isset($autoload))
{
return FALSE;
}
// 自動加載packages,也就是將package_path加入到library,model,helper,config
if (isset($autoload['packages']))
{
foreach ($autoload['packages'] as $package_path)
{
$this- add_package_path($package_path);
}
}
// 加載config文件
if (count($autoload['config']) 0)
{
$CI =& get_instance();
foreach ($autoload['config'] as $key = $val)
{
$CI- config- load($val);
}
}
// 加載helper和language
foreach (array('helper', 'language') as $type)
{
if (isset($autoload[$type]) AND count($autoload[$type]) 0)
{
$this- $type($autoload[$type]);
}
}
// 這個好像是為了兼容以前版本的
if ( ! isset($autoload['libraries']) AND isset($autoload['core']))
{
$autoload['libraries'] = $autoload['core'];
}
// 加載libraries
if (isset($autoload['libraries']) AND count($autoload['libraries']) 0)
{
// 加載db
if (in_array('database', $autoload['libraries']))
{
$this- database();
$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
}
// 加載所有其他libraries
foreach ($autoload['libraries'] as $item)
{
$this- library($item);
}
}
// Autoload models
if (isset($autoload['model']))
{
$this- model($autoload['model']);
}
}
// --------------------------------------------------------------------
/**
* 返回由對象屬性組成的關(guān)聯(lián)數(shù)組
*/
protected function _ci_object_to_array($object)
{
return (is_object($object)) get_object_vars($object) : $object;
}
// --------------------------------------------------------------------
/**
* 獲取CI某個組件的實例
*/
protected function &_ci_get_component($component)
{
$CI =& get_instance();
return $CI- $component;
}
// --------------------------------------------------------------------
/**
* 處理文件名,這個函數(shù)主要是返回正確文件名
*/
protected function _ci_prep_filename($filename, $extension)
{
if ( ! is_array($filename))
{
return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension));
}
else
{
foreach ($filename as $key = $val)
{
$filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension);
}
return $filename;
}
}
}
PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美伦理91| 日本一级淫片演员| www.国产亚洲| 最近国语视频在线观看免费播放| 欧美被狂躁喷白浆精品| 久久久久久久香蕉网| av在线亚洲天堂| 亚洲一区 中文字幕| 成人av资源| 中文字幕精品一区二区三区在线| 免费一级特黄3大片视频| 福利视频导航大全| 日韩成人在线视频网站| 小嫩嫩12欧美| 免费黄色在线视频网站| 91精品欧美福利在线观看| 欧美丰满少妇xxxxx高潮对白| 一区二区三区视频播放| 岛国av一区二区| 亚洲人成毛片在线播放女女| 国产乱色国产精品免费视频| 在线观看视频一区二区欧美日韩| 特级西西444www大精品视频免费看| 91视频久久| 亚洲va码欧洲m码| 神马午夜电影一区二区三区在线观看| 国偷自产av一区二区三区小尤奈| 日韩va欧美va亚洲va久久| 无罩大乳的熟妇正在播放| 国产极品嫩模在线观看91精品| 刘亦菲久久免费一区二区| 亚洲精品一区二区在线播放∴| 日本亚洲欧洲无免费码在线| 欧美俄罗斯性视频| 日韩免费毛片视频| jizz日本18| 不卡一卡2卡3卡4卡精品在| 超碰在线观看免费版| 亚洲一本视频| 伊人影院在线观看视频| 成人看片在线观看| 黄色91在线观看| 91精品久久久久久久久青青| 欧美一级一片| av中文字幕在线不卡| av在线免费观看网| 91玉足脚交白嫩脚丫在线播放| 久久大胆人体视频| 日韩五码在线| 国产成人精品免费看在线播放| 中国女人一级毛片| 亚洲av无码一区东京热久久| 中文字幕网站视频在线| 久久国产精品亚洲77777| 色的视频在线观看免费播放| 不卡的av影片| 欧美精品日韩www.p站| 日韩不卡一区二区三区| 最新中文字幕在线视频| 日韩高清免费在线| 国产青春久久久国产毛片| 国产精品国产三级国产专播精品人| 美日韩精品免费观看视频| 亚洲aa中文字幕| 亚洲图片有声小说| 国产精品久久久久久久久影视| 手机看片福利视频| 国产成+人+综合+亚洲欧美| 最近中文字幕mv免费高清电影| 国产精品毛片一区视频播| 欧洲在线免费视频| 一本色道久久综合亚洲精品高清| 在线观看一级片| 91久久夜色精品国产九色| 日韩欧美精品网站| av高清不卡在线| 国产一区深夜福利| 亚洲精品国产第一综合99久久| 欧美中文字幕一区二区三区| 极品尤物av丝袜美腿在线观看| 欧洲一区在线电影| 久久视频免费看| 秋霞欧美在线观看| 日韩88av| 91九色porn| 激情五月色综合亚洲小说| 国产农村妇女毛片精品| 国产午夜亚洲精品不卡| 成人在线app| 国产麻豆精品视频| 成人精品国产福利| 男生和女生一起差差差视频| 天天撸夜夜操| 国产福利免费观看| 日韩视频一区二区三区在线播放| 欧美一区二区三区激情视频| 亚洲国产精品第一区二区| 亚洲一区二区三区不卡国产欧美| 老牛影视免费一区二区| 蜜臀av中文字幕| 亚洲乱码日产精品bd在线观看| 欧美国产中文高清| 91亚洲精华国产精华| 国产成人禁片在线观看| 亚洲第一二三区| 日韩欧美在线网站| 玖玖精品视频| 高清一区在线观看| 国产igao激情在线入口| 992在线观看| 国产美女视频一区二区二三区| 荫蒂被男人添免费视频| 免费男同深夜夜行网站| 久久精品一区二区三区四区五区| 中文字幕免费高清视频| 九九九视频在线观看| 欧美特黄一级视频| 久久久久噜噜噜亚洲熟女综合| 91福利在线免费观看| 超碰免费在线播放| japan高清日本乱xxxx| 亚洲一区二区av在线| 亚洲人的天堂男人爽爽爽| 免费av在线网站| 日韩手机在线观看视频| 中文幕无线码中文字蜜桃| 国产又粗又大又爽的视频| 9191国产精品| 久久成人国产精品入口| 91精品一区二区三区四区| av黄色在线免费观看| 同心难改在线观看| 老司机免费视频一区二区| 国产卡一卡二卡三| 99精品在线观看| 亚洲一区二区在线看| 福利视频导航大全| 欧美日韩国产免费观看视频| 精品一区二区三区在线播放| 顶级黑人搡bbw搡bbbb搡| 日韩一区国产在线观看| 懂色av一区二区三区在线播放| 国产a级免费视频| 一区二区三区网站| 亚洲欧美一级二级三级| 成人在线观看视频app| 福利视频网站导航| 天堂网免费视频| 国产女主播一区二区| 久久久99精品免费观看不卡| 久久一区中文字幕| 久久发布国产伦子伦精品| 美女91精品| 一区二区不卡久久精品| 欧美视频精品全部免费观看| av影音资源网| 国产黄色一级电影| 日韩欧美高清一区| 成人影院网站ww555久久精品| 亚洲国产精品久久久久秋霞不卡| 黄色成人精品网站| 在线精品一区| 欧美性猛交xxxx黑人猛交| 一区二区三区四区久久| 日韩理论电影| 欧美日韩国产高清电影| 一区二区三区回区在观看免费视频| 婷婷夜色潮精品综合在线| 日韩免费一区二区| 国产青青草视频| 欧美精品丝袜中出| 天堂a√在线| 亚洲一区二区在线视频观看| 日韩精品在线视频观看| 欧美韩国日本一区| 精品人妻少妇嫩草av无码专区| 涩涩视频在线观看下载| 伊人久久青青草| 在线免费观看一区二区三区| 国产91色综合久久免费分享| 丁香花电影在线观看完整版| 天堂va在线| 一区二区在线观看av| 亚洲第一黄色网| 天天影视色香欲综合网老头| 久久久神马电影| 97精品在线| 狠狠噜天天噜日日噜| 久久精品一区蜜桃臀影院| 亚洲精品午夜av福利久久蜜桃| 欧美黑人性视频| 粉嫩嫩av羞羞动漫久久久| 日韩成人18| 欧美影视资讯| 日韩免费在线观看| 狠狠操五月天| 青青草原亚洲| jlzzjizz在线播放观看| www国产精品内射老熟女| www.精品av.com| 国产精品1234| 欧美日韩一区二区三区| 天天操天天操天天| 麻豆传媒免费在线观看| 欧美日韩不卡合集视频| 免费91麻豆精品国产自产在线观看| 久久久久久一区二区| 亚洲成a人片77777kkkk| 国产又粗又长又爽又黄的视频| 欧洲不卡av| 欧美日韩精品| 亚洲成人综合网站| 免费看涩涩视频| 成人亚洲精品7777| 久久久青草青青国产亚洲免观| 激情深爱一区二区| 久久九九影视网| 免费黄色网页| 亚欧精品一区| 欧美日韩中文另类| 99精品在线观看视频| 可以在线观看的黄色网址| 精品国产一二| 69**夜色精品国产69乱| 91观看网站| 欧洲视频一区二区| 93在线视频精品免费观看| 国产精品视频一二三区| 丁香六月激情婷婷| 一级片a一级片| 久草这里只有精品视频| 2019中文字幕免费视频| 日本一区二区在线看| 日韩成人一级大片| 一个人www视频在线免费观看| 国产激情99| 亚洲精品美女免费| 亚洲夫妻av| 99久久精品久久久久久清纯| 国产精品18久久久久久首页狼| 国产免费久久av| 婷婷国产精品| 国产精品9区| 欧美性视频一区二区三区| 在线高清一区| av成人 com a| 91玉足脚交白嫩脚丫| 日韩av午夜在线观看| 国产欧美一区二区白浆黑人| 亚洲大黄网站| 亚洲欧洲日产国码二区| 国产精品suv一区二区| 欧美激情免费视频| 毛片毛片毛片毛片毛片毛片| 色哟哟免费网站| 亚洲欧美日韩中文字幕在线观看| 久久天堂夜夜一本婷婷麻豆| 九九久久国产| 欧美精品日韩少妇| 中文字幕在线免费| 欧美一区二区三区四区久久| 日韩一级在线免费观看| 成人影欧美片| 欧美色图一区| 精品在线观看免费| 国产奶头好大揉着好爽视频| 视频一区二区视频| 蜜臀av性久久久久av蜜臀妖精| 成人午夜激情在线| 欧美日韩免费在线视频| 国产美女免费视频| 午夜影院免费播放| 免费看电影在线| av不卡在线播放| 午夜精品一区二区三区av| 国产永久av在线| 亚洲国产综合视频| 男人与禽猛交狂配| 夜夜嗨av色一区二区不卡| 国产精品欧美在线| 欧美日韩卡一卡二| 午夜精品久久久久久久| 青青青视频在线| 精品人人视频| 日本一区二区视频| 国产日产精品一区二区三区| 国产精品97在线| 手机在线色视频| 久久综合综合久久综合| 国产精品久久久久久久免费观看| 亚洲男人第一av网站| 国产精品1区在线| 成人午夜国产福到在线| 国产精品日日夜夜| 免费电影视频在线看| 两个人看的免费完整在线观看| 亚洲欧美日韩久久精品| 国产精品久久久久影院色老大| 91精品国产自产在线观看永久| 俺也去.com| 狠狠色狠狠色综合日日tαg| 草莓视频app18在线视频| 狠狠人妻久久久久久综合蜜桃| 五月天久久777| 国产亚洲欧美日韩俺去了| 国产精品一区在线看| 高清欧美精品xxxxx| 欧美经典影片视频网站| 中文字幕av一区二区三区谷原希美| 国产精品亚洲第五区在线| 欧美精品成人一区二区三区四区| 日本综合精品一区| 国产成人精品免费在线| 最近中文字幕mv免费高清视频8| 欧美香蕉大胸在线视频观看| 成人天堂yy6080亚洲高清| 亚洲高清资源在线观看| 2014亚洲片线观看视频免费| 亚洲综合中文字幕在线| 潮喷失禁大喷水aⅴ无码| 欧美一级在线看| 国产成人女人毛片视频在线| 怡红院av亚洲一区二区三区h| 国产日韩一区二区在线| 欧美成人高清在线| 99精品国产在热久久婷婷| 99久久精品国产观看| 色爱综合网欧美|