💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
base.php(thinkphp目录下的base.php)代码如下: # 1:常量的定义 //这里定义了tp5的一些基本常量 //定义了当前tp框架的版本为'5.0.21',可在任意控制器或视图echo THINK_VERSION;获取框架版本号 ``` define('THINK_VERSION', '5.0.21'); ``` //microtime()返回当前 Unix 时间戳的微秒数,用于对php脚本的运行计时 ``` define('THINK_START_TIME', microtime(true)); ``` //memory_get_usage返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte) ``` define('THINK_START_MEM', memory_get_usage()); ``` //定义了.php后缀 ``` define('EXT', '.php'); ``` // DIRECTORY_SEPARATOR,路径分隔符,linux上是 "/" windows上是 "\" ``` define('DS', DIRECTORY_SEPARATOR); ``` //判断是否定义了常量THINK_PATH,没有则定义常量THINK_PATH为根目录下\thinkphp\ ``` defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS); ``` //定义了library文件夹路径,根目录下\thinkphp\library\ ``` define('LIB_PATH', THINK_PATH . 'library' . DS); ``` //定义常量CORE_PATH为根目录下\thinkphp\library\think\ ``` define('CORE_PATH', LIB_PATH . 'think' . DS); ``` //定义了traits文件夹路径,根目录下\thinkphp\library\traits\ ``` define('TRAIT_PATH', LIB_PATH . 'traits' . DS); ``` /* $_SERVER['SCRIPT_FILENAME']获取的是当前执行脚本的绝对路径,不是当前PHP脚本所在的目录路径, 执行脚本指的是/public下的index.php,不是当前base.php文件,注意区分,dirname返回路径中的目录部分 这里APP_PATH常量在/public/index.php已经定义, 因此后面这句 define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS)不会执行 */ //例如输出 echo $_SERVER['SCRIPT_FILENAME'];//C:/phpStudy/PHPTutorial/WWW/ceshi1/public/index.php //APP_PATH 在前面入口文件已经定义过 //echo realpath(APP_PATH);//C:\phpStudy\PHPTutorial\WWW\ceshi1\application ``` defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS); ``` //realpath — 返回规范化的绝对路径名 /*说明 string realpath ( string $path ) realpath() 扩展所有的符号连接并且处理输入的 path 中的 '/./', '/../' 以及多余的 '/' 并返回规范化后的绝对路径名。返回的路径中没有符号连接,'/./' 或 '/../' 成分。 失败返回:FALSE*/ //echo realpath(APP_PATH); //C:\phpStudy\PHPTutorial\WWW\ceshi1\application /* dirname — 返回路径中的目录部分 说明 string dirname ( string $path ) 给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。 参数 path 一个路径。 在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。 返回值 返回 path 的父目录。 如果在 path 中没有斜线,则返回一个点('.'),表示当前目录。否则返回的是把 path 中结尾的 /component(最后一个斜线以及后面部分)去掉之后的字符串。*/ //例如输出:echo dirname(realpath(APP_PATH));//C:\phpStudy\PHPTutorial\WWW\ceshi1 //判断是否定义了常量ROOT_PATH,没有则定义常量ROOT_PATH为框架application目录所在的路径 ``` defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS); ``` //判断是否定义了常量EXTEND_PATH,没有则定义常量EXTEND_PATH为框架extend目录所在的路径 ``` defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS); ``` //判断是否定义了常量VENDOR_PATH,没有则定义常量VENDOR_PATH为框架vendor目录所在的路径 ``` defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS); ``` //判断是否定义了常量RUNTIME_PATH,没有则定义常量RUNTIME_PATH为框架runtime目录所在的路径 ``` defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS); ``` //判断是否定义了常量LOG_PATH,没有则定义常量LOG_PATH为框架\runtime\log所在的路径 ``` defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS); ``` //判断是否定义了常量CACHE_PATH,没有则定义常量CACHE_PATH为框架\runtime\cache目录所在的路径 ``` defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS); ``` //判断是否定义了常量TEMP_PATH,没有则定义常量TEMP_PATH为框架\runtime\temp目录所在的路径 ``` defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS); ``` //判断是否定义了常量CONF_PATH,没有则定义常量CONF_PATH为框架application目录所在的路径 ``` defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录 ``` //判断是否定义了常量CONF_EXT,没有则定义常量CONF_EXT为.php后缀 ``` defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀 ``` //判断是否定义了常量ENV_PREFIX,没有则定义常量ENV_PREFIX为PHP_ ``` defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀 ``` # 2: 环境变量和运行环境检测(了解即可) // 环境常量 //PHP_SAPI 用来判断是使用命令行还是浏览器执行的,nginx下PHP_SAPI输出cgi-fcgi,命令行输出cli ``` define('IS_CLI', PHP_SAPI == 'cli' ? true : false); ``` /*strpos 函数 查找 "php" 在字符串中第一次出现的位置: 注释:字符串位置从 0 开始,不是从 1 开始 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。*/ /*stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写) strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写) strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)*/ //PHP_OS php_os 检查php运行环境 //echo PHP_OS;//WINNT ``` define('IS_WIN', strpos(PHP_OS, 'WIN') !== false); ``` # 3:载入Loader类 // 载入Loader类 ``` require CORE_PATH . 'Loader.php'; ``` //定义一个别名 //\think\Loader::addNamespaceAlias('model','app\index\model'); # 4:加载环境变量配置文件 // 加载环境变量配置文件 // 加载环境变量配置文件 根目录下的.env文件,默认.env文件没有,需要自行创建 ``` if (is_file(ROOT_PATH . '.env')) { $env = parse_ini_file(ROOT_PATH . '.env', true); foreach ($env as $key => $val) { $name = ENV_PREFIX . strtoupper($key); if (is_array($val)) { foreach ($val as $k => $v) { $item = $name . '_' . strtoupper($k); putenv("$item=$v"); } } else { putenv("$name=$val"); } } } ``` # 5:注册自动加载(下章研究核心) // 注册自动加载 // 注册自动加载,执行上述载入\thinkphp\library\think\Loader.php文件中Loader类的register方法 ``` \think\Loader::register(); ``` # 6:注册错误和异常处理机制 // 注册错误和异常处理机制 /*注册错误和异常处理机制,由于当前php脚本没有Error这个类,因此触发了 \thinkphp\library\think\Loader.php文件Loader类中的register方法中 spl_autoload_register这个函数,而这个函数就会触发Loader类中的autoload方法,autoload方法会根据所该类, 找到该类对应的文件所在的目录,include进来,\think\Error会找到\thinkphp\library\think\Error.php文件 */ ``` \think\Error::register(); ``` # 7:加载惯例配置文件 // 加载惯例配置文件 /* \think\Config这个类在当前文件同样找不到,因此触发了 \thinkphp\library\think\Loader.php文件Loader类中的register方法,道理同上述一样 include了 \thinkphp\library\think\Config.php文件,执行Config.php文件中Config类中set方法, 加载惯例配置文件 载入 \thinkphp\convention.php文件里的配置*/ ``` \think\Config::set(include THINK_PATH . 'convention' . EXT); ``` 接下来我们研究注册自动加载