导语:PHP最初创建于1994年,是一个用于创建动态和交互式网站的强大且免费的开源工具。这是我们面向初学者的五篇系列文章中的第二篇,教你WordPress开发的基本概念,这样你就可以从修补者跳到开发者了。到本系列结束时,您将能够创建您自己的基本主题和插件,并使用您自己的特性来充实它们。
在本教程中,您将学习PHP的基本语法、其工作原理背后的逻辑,我将向您介绍编码示例。
注意:对于本系列,重要的是您已经彻底了解了HTML和CSS,因为这两种语言在使用WordPress时都是必不可少的构建块。
我们开始吧。
错过了我们面向初学者的WordPress开发系列教程?你可以在这里赶上所有五个帖子:
- 面向初学者的WordPress开发:入门
- 面向初学者的WordPress开发:学习PHP
- 面向初学者的WordPress开发:构建主题
- 面向初学者的WordPress开发:小工具和菜单
- 面向初学者的WordPress开发:构建插件
PHP是什么?
PHP是一种服务器端脚本语言。为了理解这意味着什么,让我们将其与HTML进行比较。
当您访问简单的HTML页面时,您的浏览器会向包含该页面的服务器发出请求。服务器会找出您需要的文件,并将其按原样发送给您。您的浏览器解释并显示HTML代码。
相比之下,当您访问PHP页面时,有一个额外的步骤。您的浏览器发送请求,服务器会找到您需要的文件。在发回任何内容之前,服务器会处理PHP文件,产生最终的HTML输出。这将被发回您的浏览器,浏览器照常显示它。
这就是为什么您可以查看任何网站的源代码,却看不到任何PHP代码,只看到HTML,即使该网站是用PHP编写的。
那么为什么服务器需要进行处理呢?这一切有什么意义?它使我们能够更高效地创建动态网站和编写代码。
让我给你们举两个简单的例子。
在HTML中,一切都是静态的。您可以创建一个显示“早上好”或“晚上好”的页面,但不能只显示其中之一,具体取决于实际时间。在PHP中,您可以这样做,因为服务器可以处理您的代码,并将一天中的实际时间考虑在内。下面是它的逻辑看起来是什么:
if it is before 10am { <h1>Good Morning</h1> } if it is after 6pm { <h1>Good Evening</h1> } otherwise { <h1>Good Day</h1> }
当然,这不是真正的代码,但它遵循PHP的逻辑。服务器确定哪个语句是真的,并且将只显示其中一个标题。
另一个很好的例子是Twitter或任何其他提供用户制作内容的网站。如果Twitter只使用HTML,那么每次你发帖时,都会有人迅速重新生成你的Twitter提要–这并不完全是对时间的有效利用。客观地说,Twitter有近10亿个账户,所以公司需要10亿个HTML文件,每个用户一个,放在某个文件夹里。
使用PHP,重新生成提要的问题可以很巧妙地用几个文件(虽然也可以用单个文件来完成)来解决。在本教程的后面,我们将回到这个示例。
开始
在我们开始之前,我想要指出的是,在学习PHP的早期阶段,您可能不会了解它与网站有什么关系。这是完全正常的反应,也正是我最初开始学习PHP时的想法。第一步有点抽象,但是在本文结束时您会明白的。
为了测试和练习您将在本教程中学到的内容,您需要一台Apache服务器。这可以是在线测试站点,也可以是本地服务器。
我建议创建本地测试服务器。以下是如何做到这一点:
首先,下载并安装VirtualBox和Vagant。在计算机上的任何位置创建一个目录来存储项目文件。我的用户目录中有一个“WebSites”文件夹,我在其中创建了一个“phpTutorial”目录。在本教程的其余部分中,我将把它称为“主项目目录”。
创建目录后,在Linux或OSX上打开终端,或在Windows上打开命令提示符,然后导航到该文件夹。如果您创建了与我相同的文件夹结构,您可以键入
Linux或OSX上的 cd /WebSites/phpTutorial, 在Windows上,您可以键入cd %HomePath%/WebSites/phpTutorial。进入正确的目录后,粘贴以下命令:
curl -L -o "install.sh" http://bit.ly/1hBfq57 && curl -L -o "Vagrantfile" http://bit.ly/1mE3Qt9 && vagrant up
这将需要相当长的时间才能完成,因为它将下载并安装一个700MB的操作系统。你只需要等一次,所以在它结束的时候买点可可。
完成后,您将可以通过http://192.168.33.21.访问您的站点。如果您重新启动计算机,您还需要重新启动服务器,这可以通过导航到终端中的主项目文件夹并键入VAMANT UP来完成。
主项目文件现在是您的根文件夹。在其中创建一个包含任何内容的index.html文件,当您访问您的网站http://192.168.33.21时,该文件应该会正确呈现。
第一步
首先,让我们看看PHP标记、变量、值和回显。
在主项目文件夹中创建一个index.php文件,并在其中键入“Hello HTML”。要验证它是否正常工作,请访问http://192.168.33.21,,您应该会看到显示的字符串。
一条非常重要的规则是,只有PHP标记内的内容才被视为PHP代码,其他任何内容都被视为HTML。这就是我们的Hello HTML文本显示的原因。PHP标签以结尾。这些标记之间的任何内容都被认为是PHP。
Hello HTML <?php echo "Hello PHP"; ?>
上面的代码显示了如何使用PHP标记,还显示了回显。当您回显一个值时,您是在告诉PHP显示它。上述代码的结果将是“Hello HTML Hello PHP”。第一部分被认为是HTML,因为它不在PHP标记内,而第二部分由PHP代码响应。请注意,您必须用引号将文本括起来。
变量允许您存储值而不显示它们。变量被广泛用于保存许多不同的东西。让我们看一个基本的例子:
<?php $name = "Daniel"; echo $name; ??>
在这里,我将值“Daniel”存储在一个名为$name的变量中。我不是直接响应“Daniel”,而是响应$name的任何值。这在这里看起来有点多余,但如果变量在很多地方使用,我们可以通过在一个地方更改变量的值来更改所有内容,而不是必须在任何地方覆盖它。
请注意,两行代码必须用分号分隔。如果您的代码产生错误,很可能是您忘了在某个地方放置分号-这是一个常见的错误,也让各地的程序员感到沮丧!
值可以是多种类型。到目前为止,我们只看了一个:字符串。字符串是一个字符序列,必须用引号引起来。另一个常见的是整数。整数是任意整数,不应放在引号中。
最重要的值类型之一是数组。数组包含多个值,这些值都可以是不同的类型。
<?php $name = 'Daniel'; $age = 30; $interests = array( 'guitar', 'singing', 'squash', 'running', 'board games' ); ?>
如您所见,数组是使用表单数组(value1、value2、value3)创建的。这些值应该始终按照在数组外部工作时定义的方式写入。字符串应该加引号,整数不应该加引号,依此类推。
我不想在这里过多地讨论数组,所以在继续之前,请先看一下W3School中关于数组的这个非常棒的教程。本教程中您应该阅读的最重要的部分是关于如何创建数组、如何添加值以及什么是关联数组。
一个简单的例子
那么,所有这些都能用来做什么呢?现在,我们到目前为止看到的还不足以创建一个网站,但一个实际的例子肯定是合适的。
让我们来看一个简单的天气预报应用程序的基本框架:
<?php $unit = "C"; $temp = 29; if( $unit == 'F' ) { $temp = $temp * 9 / 5 + 32; } $forecast = "The weather today will be great, a Sunny " . $temp . $unit; echo $forecast; ?>
有几件事是新的,但我认为这个例子很清楚地说明了这一点。让我们逐行过一遍。
最初,我们创建两个变量:one是保存摄氏值“C”的字符串,下一个变量是整数29,用于保存实际温度。
这里的目标很简单:显示一些文本,这些文本使用所选测量单位(摄氏度或华氏度)中的温度变量的值告诉我们当前温度。
下一行是IF语句,只有在括号内的值为TRUE时才执行该语句。条件是:$unit==‘F’,转换为“如果单位值是‘F’”。目前,它不是,所以让我们跳过整个if块。
一直到最后一行。
天气预报一开始就是硬编码的,“今天的天气会很好,晴朗”。根据我们的$TEMP和$UNIT变量的值,结尾会有所不同。字符串和变量之间的圆点将它们连接在一起或连接在一起。
因此,我们只需替换我们的值:$temp应该是29,$unit应该是“C”。因此,最终输出为:
The weather today will be great, a Sunny 29C
现在,如果我们将$unit更改为“F”,会发生什么情况?首先,if语句生效,因为它变成了真。这意味着花括号之间的所有内容也会被执行。在本例中,我为$TEMP变量分配了一个新值。
我取原始值,乘以9,再除以5,再加32-这就是将摄氏度换算成华氏温度的数学公式。$TEMP的新值应该是84.2,$unit的新值应该是“F”。在最后一句中用变量的值替换变量会导致:
The weather today will be great, a Sunny 84.2F
这个示例对我们仍然有点无用,但它开始显示PHP的强大功能。请注意我们是如何通过基本上将变量替换为值来获得最终输出的。它有助于进入“替换占位符”的思维模式,因为PHP本质上就是这样。
在一个真实的例子中,我们将检索当前的天空条件,而不是硬编码“好极了,晴朗”,我们将使用实际条件。我们可能还想预测明天或后天,这将导致“今天”也被占位符取代。
此外,当前温度显然不会硬编码到代码中,它需要从某个地方检索。尽管这增加了几层复杂性,但本质保持不变-我们从某个地方抓取数据并将其放入输出中。
IF语句和循环
我们已经看到一个运行中的if语句。IF语句计算括号中的条件,并根据结果选择性地处理代码。如果结果为true,则在大括号内处理代码,否则不是。
IF语句还可以具有相关的ELSE IF和ELSE语句。ELSE IF语句始终写在IF语句之后。如果原来的IF语句被证明是假的,则使用与前面相同的规则检查ELSE IF语句。可以有任意数量的Else If语句。
最后,如果导致Else语句的所有内容都是假的,则对Else语句进行求值。组中不一定要有Else If语句,只能同时有If和Else语句。
请看以下示例以了解语法和说明:
// Simple if Statement if( $speed > 50 ) { echo "You are over the speed limit"; } // If and else statement if( $age < 21 ) { echo "You may not buy alcohol"; } else { echo "You may buy alcohol"; } // If, else if and else statement if( $speed < 25 ) { echo "You are too slow"; } elseif( $speed > 120 ) { echo "You are too fast"; } else { echo "Your speed is just right!"; }
这里还需要注意的是以双斜杠开头的行。双斜杠允许您在代码中的任何位置添加单行注释。您可以添加多行注释,方法是以/*开头,想写什么就写什么,最后以*/结束。
循环有许多形状和大小,准确地说是四个。它们都允许您连续多次运行相同的代码。您现在可能讨厌它们,但是当您精通编码时,它们会成为您最亲密的盟友!
让我们从foreach循环开始。foreach循环遍历数组的所有成员并执行给定的代码。下面是一个输出HTML列表的快速示例:
<?php $names = array( "Daniel Pataki", "Raelene Morey", "James Farmer" ); echo "<ul>"; foreach( $names as $name ) { echo "<li>" . $name . "</li>"; } echo "</ul>"; ?>
这里的关键是理解括号的内容,即$NAMES作为$NAME。第一部分是要遍历的数组的名称。第二个参数是您可以引用的变量的名称,以便在循环期间获取您当前所在的数组成员的值。
在我们的示例中,循环将执行三次。在第一次传递中,$name的值将是“Daniel Pataki”,在第二次传递中将是“Raelene Morey”,在最后一次传递中将是“James Farmer”。
如果您按照我在本教程前面的建议阅读了数组,您就会知道什么是关联数组。下面的示例在关联数组中的列表中显示我的详细信息:
<?php $details = array( "name" => "Daniel Pataki", "Age" => "30", "Twitter" => "http://twitter.com/danielpataki" ); echo "<ul>"; foreach( $details as $label => $value ) { echo "<li><strong>" . $label . "</strong>: " . $value . "</li>"; } echo "</ul>"; ?>
圆括号现在包含三个变量:$DETAILS AS$LABEL=>$VALUE。我们正在检查$Details数组。在每次传递中,我们将把键称为$label,将值称为$value。在第二次传递中,$标签将是“Age”,$值将是30。代码的结果如下所示:
姓名:丹尼尔·帕塔基(Daniel Pataki)。 年龄:30岁。 推特:http://twitter.com/danielpataki。
如果您想了解更多,请查看其他可用的循环类型:WHILE循环、FOR循环和DO-WHILE循环。它们都非常相似,但有一些细微的不同。
WordPress帖子列表如何工作
现在让我们看一个与使用wordpress更相关的例子:帖子列表是如何工作的。
下面的代码并不完全模仿WordPress,但要点在那里。将帖子想象为大型关联数组的一部分。主页的代码简单地遍历该数组,并将适当的数据放在一些HTML代码中的适当位置:
$posts = array( 0 => array( "post_title" => "My First Post", "post_excerpt" => "This is a short snippet of text from the first post", "post_date" => "2015 December 1", "post_author" => "Daniel Pataki" ), 1 => array( "post_title" => "Second Post", "post_excerpt" => "Short exceprt for post number 2", "post_date" => "2015 December 4", "post_author" => "Raelene Morey" ) ); foreach( $posts as $post ) { echo "<div class='post'>"; echo "<h1>" . $post['post_title'] . "</h1>"; echo "<p>" . $post['post_excerpt'] . "</p>"; echo "<div class='post-meta'>Published on " . $post['post_date'] . " by " . $post['post_author'] . "</div>"; echo "</div>"; }
功能
在某种程度上,函数和变量的作用是一样的——一种替代代码的方法。函数可以获取一个代码块并将其存储以供以后(或多次)使用。
让我们看一个非常简单的例子,使用上面的post循环。我们回显post元素的部分可能会在网站的许多页面中使用——主页、类别存档页面、作者页面等等。我们会一次又一次地使用同一块代码。这正是函数派上用场的时候。
Published on " . $postdata['post_date'] . " by " . $postdata['post_author'] . "</div>"; echo "</div>"; } $posts = array( 0 => array( "post_title" => "My First Post", "post_excerpt" => "This is a short snippet of text from the first post", "post_date" => "2015 December 1", "post_author" => "Daniel Pataki" ), 1 => array( "post_title" => "Second Post", "post_excerpt" => "Short exceprt for post number 2", "post_date" => "2015 December 4", "post_author" => "Raelene Morey" ) ); foreach( $posts as $post ) { display_post( $post ); }
上面的代码并不短,但是只要我们想在将来显示帖子,我们只需键入display_post($post)即可;这将使它在将来变得更加高效。
那么这一切是怎么运作的呢?
让我们先看一下代码顶部的函数来实现这一点。我已经将函数命名为display_post(),在括号中可以看到它需要一个参数。我们知道该参数应该包含帖子数据,因此它将是一个包含单个帖子数据的关联数组。我已将其命名为$postdata。
在花括号中,我们包含了调用函数时要执行的所有代码。这与我们之前的代码相同,我只需要将所有变量重命名为$postdata,这是我们的参数的名称,我们可以在函数中的任何位置使用它。
在代码的底部,您可以看到现在显示帖子要干净得多,我们只使用了DISPLAY_POST($POST)。现在,我打赌你对这个名字一定很困惑。为什么$POST在一个位置,而$POSTDATA在另一个位置?
让我们来检查一下代码。
函数只有在被调用时才会运行,因此在我们的代码中真正重要的第一件事是$POSTS数组的定义。然后,我们创建一个循环,就像我们之前所做的那样。在循环中,包含单个POST数据的变量是$POST,到目前为止,我们的无函数示例没有任何变化。
现在,我们不再需要大量的代码,而是简单地遵循一个函数。我们调用display_post()函数。我们知道我们需要向它传递一些数据–单个帖子的数据。现在哪个变量包含该信息?$POST变量,它来自循环的定义。
接下来,向上滚动到该函数。它现在将被执行。在该函数中,第一个参数命名为$postdata。这仅仅意味着在函数中,我们将传递给第一个参数的数据称为$postdata。
创建摘录。
函数可以有多个参数和默认参数值。让我们创建一个函数,它可以通过将任何文本切割成片段来将其转换为摘录。我们希望我们的函数尽可能灵活,能够控制摘录长度,并在末尾追加一个字符串。
我们将第一个参数设置为要缩短的文本,第二个参数控制长度,第三个参数设置为附加的文本。
让我们首先为我们的函数提供一个可在其中工作的框架:
function make_excerpt( $text, $length = 200, $append = '...' ) { }
请注意,我已经为参数指定了默认值。这意味着您可以在不传递第二个和第三个参数的情况下调用该函数。如果您这样做,该函数将假定您想要创建一个200个字符的摘录,然后在后面追加三个点。让我们充实一下这个函数:
function get_excerpt( $text, $length = 200, $append = '...' ) { if( strlen( $text ) < $length ) { return $text; } else { $excerpt = substr( $text, 0, $length ); $excerpt .= $append; return $excerpt; } }
我在其中添加了很多新内容,所以让我们详细介绍一下每个新添加的内容。
这一切都以if语句开始,该语句检查给定的文本是否实际长于给定的长度。它使用PHP中内置的名为strlen()的函数来实现这一点。此函数接受字符串作为其参数,并返回其长度。如果$TEXT长度小于$LENGTH,则简单地返回文本-我们稍后将讨论返回的含义。
否则,我们将使用substr()函数创建摘录。此函数分割字符串并需要三个参数:要从中取出块的文本、块的起始位置和块的长度。我们想从文本的开头开始,去掉$length字符,这就是为什么我添加了0和$length。
最后,我们将附加字符串添加到末尾。我已经使用了.=符号来做到这一点。这与编写$Excerpt=$Excerpt相同。$APPEND。在最后一行中,我返回了$Excerpt变量。
那么,什么是回报呢?到目前为止,我们主要是在重复事情,但在许多情况下,我们不想显示我们的“计算”结果。strlen()函数就是一个很好的例子。您实际上并不想显示$TEXT变量的长度,您只想在代码中使用它来实现某些目的。strlen()返回它的值,允许您在其他地方使用它。
当您用函数返回值时,您可以立即使用它(就像strlen()的例子一样),或者将它赋给一个变量:$SHORT_TEXT=GET_EXCEPT($CONTENT)。然后,您可以在以后需要时回显$SHORT_TEXT。
如果您想了解更多关于函数的知识(您应该!),请查看W3School关于函数的教程。
继续阅读和学习
PHP是所有主题和插件的基础,因此您需要非常依赖此语言。在WordPress环境中工作时,您将使用PHP函数(如strlen和substr),但核心开发团队还专门为WordPress创建了数百个函数来帮助您。在本系列的后续教程中,我们已经探讨了其中的一些功能。
在这一课中,我们已经介绍了开始使用WordPress开发所需了解的基础知识,但事实是我们仅仅触及了皮毛!重要的是,您应该更深入地阅读和探索本教程中涵盖的每个主题,并练习、练习、练习!
下周请回到这里,阅读我们系列的第三部分“面向初学者的WordPress开发:构建主题”(WordPress Development for Beginners:Building Themes)。
您还可以阅读本系列的第一篇文章,面向WordPress为初学者开发:入门。
但同时,请查看以下资源来扩展和巩固您的PHP知识:
- PHP正确的方式-如果您是PHP的新手,这是对PHP的全面且结构良好的介绍。
- W3School-W3School是一个免费的Web开发人员网站,提供有关Web开发语言(如HTML、CSS、JavaScript、PHP、SQL和jQuery)的教程和参考资料,涵盖了Web编程的大部分方面。
- Tizag-Tizag.com是作为初出茅庐的站长的免费垫脚石和经验丰富的开发人员的便捷参考而创建的。该网站提供了一个教程,讲授PHP的基础知识。
- Treehouse-一个学习编程的优质网站,有1000多个由专家教师制作的关于网页设计、编码、商业等方面的视频。
- Codecademy-一个学习交互的免费网站,它提供了一个很棒的PHP入门课程。
你觉得这个教程有帮助吗?你为什么想学习WordPress开发?你想了解更多关于什么的信息?在下面的评论中让我们知道。