一、wordpress起始页index.php

开始wordpress源代码学习之旅

我是一个完全php小白,从今天开始坚持每天学一点,最终达到能自己制作自己的主题。学习个人认为最快的方法就是看大神写的源代码,所以我选择本站使用的wordpress开启我的php之旅,慢慢的进步,我使用的wordpress源代码是wordpress-5.4版本

学习过程

在完全不了解php是什么的情况下,我也不能分析出wordpress架构什么的,所以直接简单粗暴,从wordpress第一个文档开始学习,之后慢慢看懂多了代码函数后,再开始归纳wordpress架构。

上代码

index.php代码量比较少,结构也很简单,下面就是index.php中所有代码

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';

知识点1:index.php

  • index普遍意义上是首页的意思,我们输入域名后第一个找到的入口就是index
  • .php就是需要需要php服务器来解析的脚本

知识点2:<?php

  • PHP文件通常包含HTML标签和一些PHP脚本代码。PHP代码需要用
<?php
// PHP 代码
?>

这样包含起来。

  • 当一个PHP文件内只包含PHP代码时,Zend的编码规范中提到文件结尾不允许有**?>**结束符的,是为了防止有意外的结尾输出(比如空格,换行),导致程序出现意外响应。一般这种意外多发生在文件包含。index.php文件是个纯PHP代码,所以这里不能在文件结尾加?>

知识点3:/* 注释 */

注释是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码,不会被作为程序来读取和执行。PHP可以实现单行注释和多行注释,分别如下:

  • 多行注释
/*
这个时php
的多行注释
可以横跨很多行
*/
  • 单行注释
// 这是一个单行注释
# 这个也是单行注释

知识点4:define( ‘WP_USE_THEMES’, true );

  • define() 函数定义一个常量。

常量类似变量,不同之处在于:

  1. 在设定以后,常量的值无法更改
  2. 常量名不需要开头的美元符号 ($)
  3. 作用域不影响对常量的访问
  4. 常量值只能是字符串或数字

语法

define(name,value,case_insensitive)
参数 描述
name 必需。规定常量的名称。
value 必需。规定常量的值。
case_insensitive 可选。规定常量的名称是否对大小写敏感。若设置为 true,则对大小写不敏感。默认是 false(大小写敏感)。
  • WP_USE_THEMES

WP_USE_THEMES 字面意思也能理解,它定义 WordPress 是否使用主题,这里定义为 true;一般我们也不会去改这个东西。那么这个东西到底有什么用的?你可以测试一下,将它设置成:false,网站打开后就是一片空白,那么设置成 flase 的应用场景在哪里的? 我们来看看,在 WordPress 执行的过程中,哪里用到这个常量,除了在 index.php 入口文件定义了这个常量外,只有在 wp-includes 目录下的 template-loader.php 这个处理模板加载的文件中使用到这个常量。 WordPress 的执行流程大概可以分为三部分:第一步是核心文件的加载,第二步是业务逻辑的执行,第三步是模板的加载渲染,最后输出到浏览器客户端。 第三步模板的加载渲染就是通过调用 template-loader.php 这个文件来执行的,在 template-loader.php 中几乎所有的代码逻辑的执行都是需要判断 WP_USE_THEMES 这个常量的真假,只有为 true 才去执行加载模板的逻辑的。 所以在我们不想使用 WordPress 的模板加载,也就是说不输出模板数据的情况下,只是想输出原始的数据到客户端,比如 API 接口,那我们就可以直接设置这个常量为 false,这样 template-loader.php 中的加载模板的代码都不会执行。

知识点5:require __DIR__ . ‘/wp-blog-header.php’;

  • require()读入require()语句所引入的文件wp-blog-header.php,使它变成 PHP 脚本文件的一部分。与它相识功能的还有include(),区别如下

    • require()只处理文件一次,include()每次都进行读取行和评估
    • require()在一开始就加载,include()在用到时加载
    • require()读取出错是立马停止运行,但include()包含文件出错主程序可以继续运行

    PHP 系统在加载PHP程序时有一个伪编译过程,可使程序运行速度加快。但 incluce() 的文档仍为解释执行。include() 的文件中出错了,主程序继续往下执行,require 的文件出错了,主程序也停了,所以包含的文件出错对系统影响不大的话(如界面文件)就用 include(),否则用 require()。

    require() 和 include() 语句是语言结构,不是真正的函数,可以像 php 中其他的语言结构一样,例如 echo() 可以使用 echo("ab") 形式,也可以使用 echo "abc" 形式输出字符串 abc。require() 和i nclude() 语句也可以不加圆括号而直接加参数,wordpress这里及没有加()。 include_once() 和 require_once() 语句也是在脚本执行期间包括运行指定文件。此行为和 include() 语句及 require() 类似,使用方法也一样。唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。这两个语句应该用于在脚本执行期间,同一个文件有可能被包括超过一次的情况下,确保它只被包括一次,以避免函数重定义以及变量重新赋值等问题。

  • __DIR__ 是个constant variable,是获取当前路径的意思,可以保证你要引入的文件是从那个路径来的,是为防止在引用其他文件是,出现一些意想不到情况,如有下面一种目录及结构

    temp/a.php
    temp/temp1/b.php
    temp/temp1/c.php	
    

    其中a引用了b文件

    <?php
    require_once 'temp1/b.php';
    //... Code goes here ...
    ?>
    

    b引用了c文件

    <?php
    require_once 'c.php';
    // ... Code goes here ...
    ?>
    

    这时候就出现问题了!a.php 引入 b.php,可是 b.php里有引入 c.php。在这里系统会直接寻找和a.php同个目录的c.php哦!可是目前这个目录只有 a.php一个文件而已,所以某些情况下会发生一些意想不到的事情。

    有时候c.php里面的代码会不正常,又或者是 如果当前目录也有 c.php的话,两个不同目录的 c.php会被同时使用 等等。

    在 b.php的 require_once ‘c.php’ 改成 require_once __DIR__ . ‘/c.php’ 就能解决之前所说的问题了:

    <?php
    require_once __DIR__ .'/c.php';
    // ... Code goes here ...
    ?>
    

总结

如wordpress注释描述的一样,index.php就是wordpress的入口,主要为了加载wp-blog-header.php,并且定义了一个全局的宏开关,方便在这里切换控制。

参考链接

https://www.runoob.com/w3cnote/php-different-include-and-require.html

https://www.cnblogs.com/novice-programmer/articles/10533962.html

https://www.w3school.com.cn/php/func_misc_define.asp

https://blog.wpjam.com/m/wordpress-source-index-php/

发表评论