通过分析WP的代码来学习PHP。1

下载了WP的代码,并且应用到了网站上面,现在也在正常的运行中,地址是:www.freealgorithm.tk 。具体的申请过程就不赘述了,学习WP的代码。

他的目录结构就不看了,可以下载同名文件我会通过相对目录来区分。

进入网站的第一个默认的页面:/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 */
 #定义WP_USE_THEMES为true
require( dirname( __FILE__ ) . ‘/wp-blog-header.php‘ );
 #返回路径中目录部分并且连接字符串得到此php文件的位置,用这个文件代替这个位置
#引入同目录下的wp-blog-header.php文件

知识点:define函数,bool define    ( string $name   , mixed $value   [, bool $case_insensitive = false  ] ) 成功返回true否则false。
name:常量的名字。value:常量的值;仅允许标量和 null。标量的类型是 integer,float,string 或者 boolean。 也能够定义常量值的类型为 resource ,但并不推荐这么做,可能会导致未知状况的发生。

require函数替换参数指向的文件,__FILE__取得当前文件的绝对路径,dirname返回路径中的目录部分。比如这个文件返回的就是根目录/。‘.‘这个符号是字符串连接运算符,将dirname(__FILE__)返回的字符串与‘/wp-blog-header.php‘相连接然后require进去。

而/wp-blog-header.php这个文件被包含了,如下:

 1 <?php
 2
 3 /**
 4  * Loads the WordPress environment and template.
 5  载入WordPress的环境和模板*
 6  * @package WordPress
 7  */
 8
 9
10 if ( !isset($wp_did_header) ) #变量是否定义,定义返回true
11 {
12
13     $wp_did_header = true;
14
15
16     require_once( dirname(__FILE__) . ‘/wp-load.php‘ );
17
18     #用wp-load.php代替此语句
19     /*如果定义了就不继续执行,否则执行下面的语句    */
20
21     wp();
22
23
24     require_once( ABSPATH . WPINC . ‘/template-loader.php‘ );
25
26 #同样用
27 }

isset函数用来判断这个变量是否已经被定义了,如果定义了就返回true否则返回false。如果没有定义的话就执行下面的语句,$wp_did_header=true;是定义变量,他是一个布尔变量。然后require_once这个文件 ,require_once函数与require的区别是以后再这个文件里不能再包含这个文件了,即仅仅包含这个文件一次。这些的动作是定义一个布尔变量且包含一个文件。下面的wp();函数指行,现在不知道这个函数的作用,一会就会看到。然后继续包含ABSPATH.WPINC.‘/template-loader.php‘。这个文件了。ABSPATH是绝对路径的意思,这个是WP自定义的常量,还有WPINC这两个,现在我们也不知道它的值是什么。此文件到此没有结束,我们继续跟踪进入wp-load.php.

 1 <?php
 2
 3 /**
 4
 5  * Bootstrap file for setting the ABSPATH constant
 6  * and loading the wp-config.php file. The wp-config.php
 7  * file will then load the wp-settings.php file, which
 8  * will then set up the WordPress environment.
 9  *
10  * If the wp-config.php file is not found then an error
11  * will be displayed asking the visitor to set up the
12  * wp-config.php file.
13  *
14  * Will also search for wp-config.php in WordPress‘ parent
15  * directory to allow the WordPress directory to remain
16  * untouched.
17  *
18  * @internal This file must be parsable by PHP4.
19  *
20  * @package WordPress
21  */
22
23
24 /** Define ABSPATH as this file‘s directory
25 */
26
27 define( ‘ABSPATH‘, dirname(__FILE__) . ‘/‘ );
28
29
30 error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
31
32 /*error_reporting() 函数能够在运行时设置 error_reporting 指令。 PHP 有诸多错误级别,使用该函数可以设置在脚本运行时的级别。 如果没有设置可选参数 level, error_reporting() 仅会返回当前的错误报告级别。 */
33
34 if ( file_exists( ABSPATH . ‘wp-config.php‘) ) #file_exists — 检查文件或目录是否存在,绝对路径+‘wp-config.php‘检测是否存在,这个文件是设置文件,后来在网站文件上传完成后进行安装时候来创建,所以在没有安装时候是不存在这个文件的。
35 {
36
37     /** The config file resides in ABSPATH */
38
39     require_once( ABSPATH . ‘wp-config.php‘ );
40
41 #如果文件存在,require_once把文件拿来
42 #如果文件不存在,判断绝对路径取
43
44 } elseif ( file_exists( dirname(ABSPATH) . ‘/wp-config.php‘ ) && ! file_exists( dirname(ABSPATH) . ‘/wp-settings.php‘ ) )
45 {
46
47     /** The config file resides one level above ABSPATH but is not part of another install */
48
49     require_once( dirname(ABSPATH) . ‘/wp-config.php‘ );
50
51
52 } else {
53
54     // A config file doesn‘t exist
55
56
57     define( ‘WPINC‘, ‘wp-includes‘ );
58
59     define( ‘WP_CONTENT_DIR‘, ABSPATH . ‘wp-content‘ );
60
61     require_once( ABSPATH . WPINC . ‘/load.php‘ );
62
63     require_once( ABSPATH . WPINC . ‘/version.php‘ );
64
65
66     wp_check_php_mysql_versions();
67
68     wp_load_translations_early();
69
70     // Standardize $_SERVER variables across setups.
71
72     wp_fix_server_vars();
73
74
75     require_once( ABSPATH . WPINC . ‘/functions.php‘ );
76
77
78     $path = wp_guess_url() . ‘/wp-admin/setup-config.php‘;
79
80     // Die with an error message
81
82     $die  = __( "There doesn‘t seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . ‘</p>‘;
83
84     $die .= ‘<p>‘ . __( "Need more help? <a href=‘http://codex.wordpress.org/Editing_wp-config.php‘>We got it</a>." ) . ‘</p>‘;
85
86     $die .= ‘<p>‘ . __( "You can create a <code>wp-config.php</code> file through a web interface, but this doesn‘t work for all server setups. The safest way is to manually create the file." ) . ‘</p>‘;
87     $die .= ‘<p><a href="‘ . $path . ‘" class="button button-large">‘ . __( "Create a Configuration File" ) . ‘</a>‘;
88
89
90     wp_die( $die, __( ‘WordPress &rsaquo; Error‘ ) );
91 }

代码稍长,但是以后的代码会更长。这里看到了他的注释说定义ABSPATH为当前文件的目录,而且看到了这个define语句,知道了ABSPATH是dirname(__FILE__).‘/‘。其实还是这个根目录。error_reporting函数的说明在代码里面注释着意思是定义错误级别,我在书中也没有看到类似的说明这个函数,现在不予理会。
if当前绝对路径下的  /wp-config.php文件存在的话就require这个文件。不存在的话继续判断(/wp-config.php和/wp-settings.php)文件是否不存在,那么判断wp-config.php这个文件的判断是否多余?wp-setting.php这个文件是存在的,而wp-config.php是后来在安装时后生成的,第一次安装使用时候是没有的。否则就定义WPINC为‘wp-includes‘,define( ‘WP_CONTENT_DIR‘, ABSPATH . ‘wp-content‘ );require_once( ABSPATH . WPINC . ‘/load.php‘ );这句是将 /wp-includes/load.php包含进去,require_once( ABSPATH . WPINC . ‘/version.php‘ );这句将/wp-includes/version.php包含进去。先跟踪进去/wp-includes/load.php。

  1 <?php
  2
  3 /**
  4  * These functions are needed to load WordPress.
  5  *
  6  * @internal This file must be parsable by PHP4.
  7  *
  8  * @package WordPress
  9  */
 10
 11
 12 /**
 13  * Turn register globals off.
 14  *
 15  * @access private
 16  * @since 2.1.0
 17  * @return null Will return null if register_globals PHP directive was disabled
 18  */
 19
 20 function wp_unregister_GLOBALS()
 21 {
 22
 23     if ( !ini_get( ‘register_globals‘ ) )
 24
 25         return;
 26
 27
 28     if ( isset( $_REQUEST[‘GLOBALS‘] ) )
 29
 30         die( ‘GLOBALS overwrite attempt detected‘ );
 31
 32     // Variables that shouldn‘t be unset
 33
 34     $no_unset = array( ‘GLOBALS‘, ‘_GET‘, ‘_POST‘, ‘_COOKIE‘, ‘_REQUEST‘, ‘_SERVER‘, ‘_ENV‘, ‘_FILES‘, ‘table_prefix‘ );
 35
 36
 37     $input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset( $_SESSION ) && is_array( $_SESSION ) ? $_SESSION : array() );
 38     foreach ( $input as $k => $v )
 39
 40         if ( !in_array( $k, $no_unset ) && isset( $GLOBALS[$k] ) )
 41         {
 42
 43             unset( $GLOBALS[$k] );
 44
 45         }
 46
 47 }
 48
 49
 50 /**
 51  * Fix $_SERVER variables for various setups.
 52  *
 53  * @access private
 54  * @since 3.0.0
 55  */
 56
 57 function wp_fix_server_vars()
 58 {
 59
 60     global $PHP_SELF;
 61
 62
 63     $default_server_values = array(
 64
 65         ‘SERVER_SOFTWARE‘ => ‘‘,
 66
 67         ‘REQUEST_URI‘ => ‘‘,
 68
 69     );
 70
 71
 72     $_SERVER = array_merge( $default_server_values, $_SERVER );
 73
 74     // Fix for IIS when running with PHP ISAPI
 75
 76     if ( empty( $_SERVER[‘REQUEST_URI‘] ) || ( php_sapi_name() != ‘cgi-fcgi‘ && preg_match( ‘/^Microsoft-IIS\//‘, $_SERVER[‘SERVER_SOFTWARE‘] ) ) )
 77     {
 78
 79         // IIS Mod-Rewrite
 80
 81         if ( isset( $_SERVER[‘HTTP_X_ORIGINAL_URL‘] ) )
 82         {
 83
 84             $_SERVER[‘REQUEST_URI‘] = $_SERVER[‘HTTP_X_ORIGINAL_URL‘];
 85
 86         }
 87         // IIS Isapi_Rewrite
 88
 89         else if ( isset( $_SERVER[‘HTTP_X_REWRITE_URL‘] ) ) {
 90
 91             $_SERVER[‘REQUEST_URI‘] = $_SERVER[‘HTTP_X_REWRITE_URL‘];
 92
 93         } else {
 94             // Use ORIG_PATH_INFO if there is no PATH_INFO
 95
 96             if ( !isset( $_SERVER[‘PATH_INFO‘] ) && isset( $_SERVER[‘ORIG_PATH_INFO‘] ) )
 97
 98                 $_SERVER[‘PATH_INFO‘] = $_SERVER[‘ORIG_PATH_INFO‘];
 99
100
101             // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
102
103             if ( isset( $_SERVER[‘PATH_INFO‘] ) ) {
104
105                 if ( $_SERVER[‘PATH_INFO‘] == $_SERVER[‘SCRIPT_NAME‘] )
106
107                     $_SERVER[‘REQUEST_URI‘] = $_SERVER[‘PATH_INFO‘];
108
109                 else
110
111                     $_SERVER[‘REQUEST_URI‘] = $_SERVER[‘SCRIPT_NAME‘] . $_SERVER[‘PATH_INFO‘];
112                         }
113
114
115             // Append the query string if it exists and isn‘t null
116
117             if ( ! empty( $_SERVER[‘QUERY_STRING‘] ) ) {
118
119                 $_SERVER[‘REQUEST_URI‘] .= ‘?‘ . $_SERVER[‘QUERY_STRING‘];
120
121             }
122
123         }
124
125     }
126
127
128     // Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests
129
130     if ( isset( $_SERVER[‘SCRIPT_FILENAME‘] ) && ( strpos( $_SERVER[‘SCRIPT_FILENAME‘], ‘php.cgi‘ ) == strlen( $_SERVER[‘SCRIPT_FILENAME‘] ) - 7 ) )
131
132         $_SERVER[‘SCRIPT_FILENAME‘] = $_SERVER[‘PATH_TRANSLATED‘];
133
134     // Fix for Dreamhost and other PHP as CGI hosts
135
136     if ( strpos( $_SERVER[‘SCRIPT_NAME‘], ‘php.cgi‘ ) !== false )
137
138         unset( $_SERVER[‘PATH_INFO‘] );
139
140     // Fix empty PHP_SELF
141
142     $PHP_SELF = $_SERVER[‘PHP_SELF‘];
143
144     if ( empty( $PHP_SELF ) )
145
146         $_SERVER[‘PHP_SELF‘] = $PHP_SELF = preg_replace( ‘/(\?.*)?$/‘, ‘‘, $_SERVER["REQUEST_URI"] );
147
148 }
149
150
151 /**
152  * Check for the required PHP version, and the MySQL extension or a database drop-in.
153  *
154  * Dies if requirements are not met.
155  *
156  * @access private
157  * @since 3.0.0
158  */
159
160
161 function wp_check_php_mysql_versions() {
162
163     global $required_php_version, $wp_version;
164
165     $php_version = phpversion();
166
167     if ( version_compare( $required_php_version, $php_version, ‘>‘ ) ) {
168
169         wp_load_translations_early();
170
171         header( ‘Content-Type: text/html; charset=utf-8‘ );
172
173         die( sprintf( __( ‘Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.‘ ), $php_version, $wp_version, $required_php_version ) );
174
175     }
176
177
178     if ( ! extension_loaded( ‘mysql‘ ) && ! extension_loaded( ‘mysqli‘ ) && ! file_exists( WP_CONTENT_DIR . ‘/db.php‘ ) ) {
179
180         wp_load_translations_early();
181
182         header( ‘Content-Type: text/html; charset=utf-8‘ );
183
184         die( __( ‘Your PHP installation appears to be missing the MySQL extension which is required by WordPress.‘ ) );
185
186     }
187
188 }
189
190
191
192 /**
193  * Don‘t load all of WordPress when handling a favicon.ico request.
194  * Instead, send the headers for a zero-length favicon and bail.
195  *
196  * @since 3.0.0
197  */
198
199
200 function wp_favicon_request() {
201
202     if ( ‘/favicon.ico‘ == $_SERVER[‘REQUEST_URI‘] ) {
203
204         header(‘Content-Type: image/vnd.microsoft.icon‘);
205
206         header(‘Content-Length: 0‘);
207
208         exit;
209
210     }
211
212 }
213
214
215 /**
216  * Dies with a maintenance message when conditions are met.
217  *
218  * Checks for a file in the WordPress root directory named ".maintenance".
219  * This file will contain the variable $upgrading, set to the time the file
220  * was created. If the file was created less than 10 minutes ago, WordPress
221  * enters maintenance mode and displays a message.
222  *
223  * The default message can be replaced by using a drop-in (maintenance.php in
224  * the wp-content directory).
225  *
226  * @access private
227  * @since 3.0.0
228  */
229
230
231 function wp_maintenance() {
232
233     if ( !file_exists( ABSPATH . ‘.maintenance‘ ) || defined( ‘WP_INSTALLING‘ ) )
234
235         return;
236
237
238     global $upgrading;
239
240
241     include( ABSPATH . ‘.maintenance‘ );
242
243     // If the $upgrading timestamp is older than 10 minutes, don‘t die.
244
245     if ( ( time() - $upgrading ) >= 600 )
246
247         return;
248
249
250     if ( file_exists( WP_CONTENT_DIR . ‘/maintenance.php‘ ) ) {
251
252         require_once( WP_CONTENT_DIR . ‘/maintenance.php‘ );
253
254         die();
255
256     }
257
258
259     wp_load_translations_early();
260
261
262     $protocol = $_SERVER["SERVER_PROTOCOL"];
263
264     if ( ‘HTTP/1.1‘ != $protocol && ‘HTTP/1.0‘ != $protocol )
265
266         $protocol = ‘HTTP/1.0‘;
267
268     header( "$protocol 503 Service Unavailable", true, 503 );
269
270     header( ‘Content-Type: text/html; charset=utf-8‘ );
271
272     header( ‘Retry-After: 600‘ );
273
274 ?>

这是load.php的php部分,下面就基本是html代码了,html先不予分析。ini_get返回配制选项的值

时间: 2024-12-18 03:13:08

通过分析WP的代码来学习PHP。1的相关文章

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

面向对象分析与设计之OOA学习

1.从需求到业务用例图 OOA&D的第一步,就是了解用户需求,并将其转换为业务用例图.我们的 CMS系统需求非常简单,大致可做如下描述:这个系统主要用来发布新闻,管理员只需要一个,登录后可以在后台发布新闻.任何人可以浏览新闻,浏览者可以注 册成为系统会员,注册后可对新闻进行评论.管理员在后台可以对新闻.评论.注册会员进行管理,如修改.删除等.通过以上需求描述,我们画出如下的业务用例 图: 业务用例图 这里要注意三点: 1.业务用例是仅从系统业务角度关注的用例,而不是具体系统的用例.它描述的是“该

【转帖】【面向代码】学习 Deep Learning(一)Neural Network

最近一直在看Deep Learning,各类博客.论文看得不少 但是说实话,这样做有些疏于实现,一来呢自己的电脑也不是很好,二来呢我目前也没能力自己去写一个toolbox 只是跟着Andrew Ng的UFLDL tutorial 写了些已有框架的代码(这部分的代码见github) 后来发现了一个matlab的Deep Learning的toolbox,发现其代码很简单,感觉比较适合用来学习算法 再一个就是matlab的实现可以省略掉很多数据结构的代码,使算法思路非常清晰 所以我想在解读这个too

《Linux内核分析》第七周学习总结

<Linux内核分析>第七周学习总结                         ——可执行程序的装载 姓名:王玮怡  学号:20135116 一.理论部分总结 (一)可执行程序的装载 1.预处理.编译.链接和目标文件的格式 C代码经过编译器的预处理(.cpp),然后编译成汇编代码(.asm/.s),由汇编器成目标代码(.o,二进制文件),再链接成可执行文件,最后由操作系统加载到内存中执行. 预处理:编译器将C源代码中包含的头文件编译进来和执行宏替换等工作 gcc -E hello.c -

自学C语言第二课——选择编译器并开始分析别人的代码

听说现在我在大学大学的同学普遍用的编译器是VC6.0,为了方便向他们请教,于是我刚开始决定选择VC6.0来学习.可是安装的过程出现种种问题,我又不想用绿色版,所以最后选择了安装极为方便的DEV-C++.我想要从分析别人的代码开始学起.同学向我推荐了一本书.然后,我就开始分析书里面的代码. 例题1: 通过百度和看我在大学的同学给我的资料,我认识到: 1.关于<stdio.h> stdio.h就是指“standardinput&output" 意思就是说标准输入输出头文件! 所以

[PHP工具推荐]0001.分析和解析代码的7大工具

引言:PHP已成为时下最热门的编程语言之一,然而却有许多PHP程序员苦恼找不到合适的工具来帮助自己分析和解析PHP代码.今天SD就为大家介绍几个非常不错的工具,来帮助程序员们提高自己的工作效率,一起来看看吧! 工具索引: PHP Parser PHPSandbox PHP Mess Detector PHPCPD PHPCheckstyle Ubench PHP Analyzer PHP Parser PHP-Parser是一个用PHP编写的PHP解析器(支持PHP 5.4以及更早的版本),这种

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中