2015-04-01 226 views
1

我正在学习PHP和WordPress开发过程。在Wordpress模板加载器中测试WP_USE_THEMES常量的值

我想了解WordPress的代码,我开始与index.php

予理解的是,index.php定义的常数WP_USE_THEMES作为TRUE

define('WP_USE_THEMES', TRUE); 

这随后通过wp-includes/template-loader.php拾起。

我想出了模板加载器试图看看是否定义了WP_USE_THEMES,但我不明白以下语句意味着什么。请你向我解释下面的代码块意味着什么。

if (defined('WP_USE_THEMES') && WP_USE_THEMES) 

回答

1

该行正在检查以查看是否1)该常数已设置,以及2)是否为真。

如果这些条件中的任何一个都不符合,则紧随其后的行中的代码或紧随其后的任何括号之间的代码将不会运行。

不变的是真实的

define('WP_USE_THEMES', TRUE); 
    if (defined('WP_USE_THEMES') && WP_USE_THEMES) 
     //code runs 

不变的是不是真的

define('WP_USE_THEMES', FALSE); 
if (defined('WP_USE_THEMES') && WP_USE_THEMES) 
    //code does not run 

恒未设置

if (defined('WP_USE_THEMES') && WP_USE_THEMES) 
     //code does not run 
2

为了让多一点背景 - 这是一个有点防御性编程。

本质上这个条件所做的“主要”事情是检查WP_USE_THEMES是否为真。

但是,在尝试检查其值之前,它首先添加一个额外的检查以查看是否定义了WP_USE_THEMES。在许多语言中,逻辑AND条件一次只能评估一个条件,如果第一个条件为FALSE,则AND评估将暂停并返回总体值FALSE。 (这是因为AND条件的第二部分是无关紧要的 - 假设& & X将始终返回FALSE,而不管X是什么。)所以这只是防止任何可能的错误或标志,如果WP_USE_THEMES未定义,则在实际的TRUE/FALSE检查完成。

同样,如果第一部分评估为TRUE,则OR评估将提前中止,如TRUE ||。无论X是什么,X总是返回TRUE。

2

到目前为止的答案是正确的,但对于此代码的解释并不完整。 更具体地说,如果您只是测试了WP_USE_THEMES并且没有定义,那么您会收到一个错误,代码会在那里停止。所以这两个条件必须存在,并按照这个顺序,如果它没有被定义(),那么第二个测试是否是真的没有被处理,所以没有错误。 你会经常看到这种类型的conditinal测试:

if(isset($_POST['var']) && $_POST['var'] === true){ 

是另一个典型的例子。是否发布了var,如果是这样,它是否等于true。

还有一点需要注意的是您的示例中显示的简写形式:隐式测试是否为true。完全有效,写得更快,但不够明确。也有可能引入一个bug,因为很多事情会被评估为true/false,而不是一个明确的布尔值,并且在很多情况下这将会很重要。这就是为什么我的例子使用类型相等测试(===)。

因此,当您学习使用该语言时,您还必须学会尽可能的明确,并尽可能让您的代码尽可能容易理解。否则,当你明年要修改它时,你会刻意试图记住你的代码在做什么以及为什么。