0 ? $argv : array();
if(count($args) == 0 && isset($_SERVER['argv'])
&& is_array($_SERVER['argv']) && count($_SERVER['argv']) > 0) {
$args = $_SERVER['argv'];
}
$cliAgs = QiiHandleCliArgs($args);
$_SERVER['__CLI_ARGS'] = $cliAgs;
$_SERVER['REQUEST_URI'] = $cliAgs[1] . ($cliAgs[3] ? '?'. $cliAgs[3] : '');
$_SERVER['QUERY_STRING'] = $cliAgs[3];
$_SERVER['SCRIPT_NAME'] = $cliAgs[0];
$_GET = $cliAgs[2];
$_POST = $cliAgs[2];
define('PATH_INFO', $cliAgs[1]);
} else {
define('PATH_INFO', isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
}
/**
* EOL 和 SPACE
*/
define('QII_EOL', IS_CLI ? PHP_EOL : '
');
define('QII_SPACE', IS_CLI ? ' ' : ' ');
require QII_DIR . DS . 'Autoloader' . DS . 'Import.php';
Import::setFileLoaded(QII_DIR . DS . 'Autoloader' . DS . 'Import.php');
Import::requires(
array(QII_DIR . DS . 'Config' . DS . 'Consts.php',
QII_DIR . DS . 'Functions' . DS . 'Funcs.php',
QII_DIR . DS . 'Autoloader' . DS . 'Factory.php',
QII_DIR . DS . 'Application.php',
QII_DIR . DS . 'Autoloader' . DS . 'Psr4.php',
QII_DIR . DS . 'Config' . DS . 'Arrays.php',
)
);
function QiiHandleCliArgs($parameter) {
$fileName = array_shift($parameter);
$uri = array_shift($parameter);
if(substr($uri, 0, 1) != '/') {
$uri = "/". $uri;
}
//解析parameter
$params = array();
$query = [];
foreach ($parameter as $value) {
preg_match("/\{(?P(.*?))(\=|\:)(?P(.*).+)\}/", $value, $matches);
if($matches && isset($matches['name'])) {
$params[$matches['name']] = $matches['value'];
$query[] = $matches['name'] .'='. urlencode($matches['value']);
}else {
preg_match("/(?P(.*?))(\=|\:)(?P(.*).+)/", $value, $matches);
if($matches && isset($matches['name'])) {
$params[$matches['name']] = $matches['value'];
$query[] = $matches['name'] . '=' . urlencode($matches['value']);
}else{
$parameter[$value] = '';
$query[] = $value .'=';
}
}
}
return array($fileName, $uri, $params, join("&", $query));
}
class Qii extends Application
{
public function __construct()
{
parent::__construct();
}
/**
* Instance func
*
**/
public static function getInstance()
{
if (func_num_args() > 0) {
$args = func_get_args();
return call_user_func_array(array('\Qii\Autoloader\Factory', 'getInstance'), $args);
}
return Factory::getInstance('\Qii');
}
/**
* 设置private 属性
*
* @param String $name
* @param Mix $value
*/
public static function setPrivate($name, $value)
{
return Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->setPrivate($name, $value);
}
/**
* 获取private属性
*
* @param String $name
* @param String $key
* @return Mix
*/
public static function getPrivate($name, $key = '')
{
$private = Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->get($name);
if (preg_match('/^\s*$/', $key)) {
return $private;
}
if (isset($private[$key])) return $private[$key];
}
/**
* 获取语言包内容指定的内容
*
* @return mixed
*/
public static function i()
{
return call_user_func_array(array(
Psr4::getInstance()->loadClass('\Qii\Language\Loader'), 'i'),
func_get_args()
);
}
/**
* 错误设置,如果满足给定的条件就直接返回false,否则在设置了错误页面的情况下返回true
* 如果出错后要终止的话,需要自行处理,此方法不错停止不执行
*
* @param Bool $condition
* @param int $line 出错的行数,这样以便轻松定位错误
* @param String $msg
* @param Int|String $code
* @return Bool
*/
public static function setError($condition, $line = 0, $code = 0, $args = null, $msg = '')
{
return call_user_func_array(array('\Qii\Exceptions\Error', 'setError'), func_get_args());
}
/**
* 抛出异常
*
* @return mixed
*/
public static function e()
{
return call_user_func_array(array('\Qii\Exceptions\Errors', 'e'), func_get_args());
}
/**
* 返回当前app的配置
* @param string $key 如果需要返回单独的某一个key就指定一下这个值
* @return mixed
*/
public static function appConfigure($key = null)
{
return Register::getAppConfigure(\Qii::getInstance()->getAppIniFile(), $key);
}
/**
* 当调用Qii不存在的方法的时候,试图通过Autoload去加载对应的类
* 示例:
* \Qii::getInstance()->Qii_Autoloader_Psr4('instance', 'Model\User');
* 此方法将调用:Qii_Autoloader_Psr4->instance('Model\User');
*/
public function __call($className, $args)
{
return call_user_func_array(array(Psr4::getInstance(), 'loadClass'), func_get_args());
}
/**
* 当调用不存在的静态方法的时候会试图执行对应的类和静态方法
* 斜线将会转换成下划线
* 示例:
* \Qii::Qii_Autoloader_Psr4('getInstance')
* 此方法将调用:\Qii\Autoloader\Psr4::getInstance静态方法
* Qii::InstanceApp("App");
* 此方法将调用:InstanceApp::App()静态方法
*/
public static function __callStatic($className, $args)
{
$method = array_shift($args);
$className = Psr4::getInstance()->getClassName($className);
return call_user_func_array($className . '::' . $method, $args);
}
}
if (!function_exists('catch_fatal_error')) {
function catch_fatal_error()
{
// Getting Last Error
$error = error_get_last();
// Check if Last error is of type FATAL
if (isset($error['type']) && $error['type'] == E_ERROR) {
// Fatal Error Occurs
$message = array();
$message[] = 'Error file : ' . str_replace(Psr4::realpath($_SERVER['DOCUMENT_ROOT']), '', $error['file']);
$message[] = 'Error line : ' . $error['line'] . ' on ' . \Qii\Exceptions\Errors::getLineMessage($error['file'], $error['line']);
$message[] = 'Error description : ' . $error['message'];
if (IS_CLI) {
$cli = new \Qii\Response\Cli();
return $cli->stdout(
str_replace(" "
, " "
, strip_tags(join(PHP_EOL, preg_replace("/[\n|\r\n]/", PHP_EOL, $message)))
)
);
}
\Qii\Exceptions\Error::showError($message);
}
}
}
//注册名称空间
$namespace = _include(QII_DIR . DS . 'Config' . DS . 'Namespace.php');
Psr4::getInstance()
->register()
->setUseNamespaces(isset($namespace['setUseNamespace']) ? $namespace['setUseNamespace']: [])
->addNamespaces(isset($namespace['addNamespace']) ? $namespace['addNamespace'] : []);
//加载默认语言包
Factory::getInstance('\Qii\Language\Loader')->load('error', QII_DIR . DS . 'Language');
Factory::getInstance('\Qii\Language\Loader')->load('exception', QII_DIR . DS . 'Language');
Factory::getInstance('\Qii\Language\Loader')->load('resource', QII_DIR . DS . 'Language');
//捕获FATAL错误,用户可以选择记录到日志,还是直接显示或者不显示错误
register_shutdown_function('catch_fatal_error');
set_exception_handler(array('\Qii\Exceptions\Errors', 'getError'));
set_error_handler(array('\Qii\Exceptions\Errors', 'getError'), E_USER_ERROR);