CodeIgniter 核心代码阅读-公用函数文件Common.php

来源:互联网 发布:批量调整图片大小软件 编辑:程序博客网 时间:2024/05/16 05:26

Common.php公用函数文件

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');//判断正在使用的PHP的版本号是否高于你所提供的 version_number //如果已安装的PHP版本号等于或高于你所提供的版本号,本函数将返回布尔值 TRUE。如果安装的PHP版本号低于你所提供的那个版本号,本函数将返回 FALSE。if ( ! function_exists('is_php')){function is_php($version = '5.0.0'){static $_is_php;$version = (string)$version;if ( ! isset($_is_php[$version])){$_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE;}return $_is_php[$version];}}//在Windows平台,is_writable()函数在实际没有文件写权限时也返回真。那是因为,只有文件有只读属性时,操作系统才向PHP报告为假。这个函数依靠对文件的先行写入来//判断是否真的具有写权限。 通常情况下,只有在这个信息不可靠的平台上才推荐使用。//此函数也可用于判断文件夹是否有可写权限if ( ! function_exists('is_really_writable')){function is_really_writable($file){// If we're on a Unix server with safe_mode off we call is_writableif (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){return is_writable($file);}// For windows servers and safe_mode "on" installations we'll actually// write a file then read it.  Bah...if (is_dir($file)){$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){return FALSE;}fclose($fp);@chmod($file, DIR_WRITE_MODE);@unlink($file);return TRUE;}elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){return FALSE;}fclose($fp);return TRUE;}}//实例化类,实例化的类都是单类,保存在$_classes中,返回的是对$_classes中的类的引用if ( ! function_exists('load_class')){function &load_class($class, $directory = 'libraries', $prefix = 'CI_'){static $_classes = array();// Does the class exist?  If so, we're done...if (isset($_classes[$class])){return $_classes[$class];}$name = FALSE;// Look for the class first in the local application/libraries folder// then in the native system/libraries folderforeach (array(APPPATH, BASEPATH) as $path){if (file_exists($path.$directory.'/'.$class.'.php')){$name = $prefix.$class;if (class_exists($name) === FALSE){require($path.$directory.'/'.$class.'.php');}break;}}// Is the request a class extension?  If so we load it tooif (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')){$name = config_item('subclass_prefix').$class;if (class_exists($name) === FALSE){require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');}}// Did we find the class?if ($name === FALSE){// Note: We use exit() rather then show_error() in order to avoid a// self-referencing loop with the Excptions classexit('Unable to locate the specified class: '.$class.'.php');}// Keep track of what we just loadedis_loaded($class);$_classes[$class] = new $name();return $_classes[$class];}}//标记已加载类,这个理解起来比较别扭,不是判断是否已加载某个类,而是标记所有已加载的类//返回的是对静态变量$_is_loaded的引用if ( ! function_exists('is_loaded')){function &is_loaded($class = ''){static $_is_loaded = array();if ($class != ''){$_is_loaded[strtolower($class)] = $class;}return $_is_loaded;}}//获取配置数组if ( ! function_exists('get_config')){function &get_config($replace = array()){static $_config;if (isset($_config)){return $_config[0];}// Is the config file in the environment folder?if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')){$file_path = APPPATH.'config/config.php';}// Fetch the config fileif ( ! file_exists($file_path)){exit('The configuration file does not exist.');}require($file_path);// Does the $config array exist in the file?if ( ! isset($config) OR ! is_array($config)){exit('Your config file does not appear to be formatted correctly.');}// Are any values being dynamically replaced?if (count($replace) > 0){foreach ($replace as $key => $val){if (isset($config[$key])){$config[$key] = $val;}}}return $_config[0] =& $config;}}//获取配置项if ( ! function_exists('config_item')){function config_item($item){static $_config_item = array();if ( ! isset($_config_item[$item])){$config =& get_config();if ( ! isset($config[$item])){return FALSE;}$_config_item[$item] = $config[$item];}return $_config_item[$item];}}//显示错误if ( ! function_exists('show_error')){function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered'){$_error =& load_class('Exceptions', 'core');echo $_error->show_error($heading, $message, 'error_general', $status_code);exit;}}//显示404错误if ( ! function_exists('show_404')){function show_404($page = '', $log_error = TRUE){$_error =& load_class('Exceptions', 'core');$_error->show_404($page, $log_error);exit;}}//记录错误日志if ( ! function_exists('log_message')){function log_message($level = 'error', $message, $php_error = FALSE){static $_log;if (config_item('log_threshold') == 0){return;}$_log =& load_class('Log');$_log->write_log($level, $message, $php_error);}}//设置HTTP状态if ( ! function_exists('set_status_header')){function set_status_header($code = 200, $text = ''){$stati = array(200=> 'OK',201=> 'Created',202=> 'Accepted',203=> 'Non-Authoritative Information',204=> 'No Content',205=> 'Reset Content',206=> 'Partial Content',300=> 'Multiple Choices',301=> 'Moved Permanently',302=> 'Found',304=> 'Not Modified',305=> 'Use Proxy',307=> 'Temporary Redirect',400=> 'Bad Request',401=> 'Unauthorized',403=> 'Forbidden',404=> 'Not Found',405=> 'Method Not Allowed',406=> 'Not Acceptable',407=> 'Proxy Authentication Required',408=> 'Request Timeout',409=> 'Conflict',410=> 'Gone',411=> 'Length Required',412=> 'Precondition Failed',413=> 'Request Entity Too Large',414=> 'Request-URI Too Long',415=> 'Unsupported Media Type',416=> 'Requested Range Not Satisfiable',417=> 'Expectation Failed',500=> 'Internal Server Error',501=> 'Not Implemented',502=> 'Bad Gateway',503=> 'Service Unavailable',504=> 'Gateway Timeout',505=> 'HTTP Version Not Supported');if ($code == '' OR ! is_numeric($code)){show_error('Status codes must be numeric', 500);}if (isset($stati[$code]) AND $text == ''){$text = $stati[$code];}if ($text == ''){show_error('No status text available.  Please check your status code number or supply your own message text.', 500);}$server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;if (substr(php_sapi_name(), 0, 3) == 'cgi'){header("Status: {$code} {$text}", TRUE);}elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0'){header($server_protocol." {$code} {$text}", TRUE, $code);}else{header("HTTP/1.1 {$code} {$text}", TRUE, $code);}}}//记录异常日志if ( ! function_exists('_exception_handler')){function _exception_handler($severity, $message, $filepath, $line){ // We don't bother with "strict" notices since they tend to fill up // the log file with excess information that isn't normally very helpful. // For example, if you are running PHP 5 and you use version 4 style // class functions (without prefixes like "public", "private", etc.) // you'll get notices telling you that these have been deprecated.if ($severity == E_STRICT){return;}$_error =& load_class('Exceptions', 'core');// Should we display the error? We'll get the current error_reporting// level and add its bits with the severity bits to find out.if (($severity & error_reporting()) == $severity){$_error->show_php_error($severity, $message, $filepath, $line);}// Should we log the error?  No?  We're done...if (config_item('log_threshold') == 0){return;}$_error->log_exception($severity, $message, $filepath, $line);}}//这个函数能防止在ASCII字符之间插入空字符,如Java\0script.if ( ! function_exists('remove_invisible_characters')){function remove_invisible_characters($str, $url_encoded = TRUE){$non_displayables = array();// every control character except newline (dec 10)// carriage return (dec 13), and horizontal tab (dec 09)if ($url_encoded){$non_displayables[] = '/%0[0-8bcef]/';// url encoded 00-08, 11, 12, 14, 15$non_displayables[] = '/%1[0-9a-f]/';// url encoded 16-31}$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';// 00-08, 11, 12, 14-31, 127do{$str = preg_replace($non_displayables, '', $str, -1, $count);}while ($count);return $str;}}//利用此功能可以方便的使用htmlspecialchars()函数。它接受字符串和数组。有助于防止跨站脚本攻击(XSS)。if ( ! function_exists('html_escape')){function html_escape($var){if (is_array($var)){return array_map('html_escape', $var);}else{return htmlspecialchars($var, ENT_QUOTES, config_item('charset'));}}}


原创粉丝点击