若是你使用一面大镜子做为冲浪板会发生什么?或许你会在较短的时间内征服海浪,可是你确定从心里深处明白,这不是冲浪的正确选择。一样的道理也适用于PHP编程,尽管这样的类比听起来有一些古怪。咱们常常听到有人试图用一个周末多点的时间来学会PHP,可是请恕我直言,这是学习这门编程语言的一种很是糟糕的方式。
为什么说学习PHP的过程有别于任何其它语言?
就其本质而言,若是你掌握了以PHP语言“作事”的方式,那么在使用它时就会驾轻就熟,所以值得你去投入精力去了解这些方式。在PHP中,单纯按照本身思路去解决问题每每会是一种错误的办法。这并非由于你是一个糟糕的程序员,而是由于若是你想写出好的可维护性强的代码,有些标准技巧是你必需要使用的。下面让咱们一块儿看一下你须要知道的10大技巧。
一、如何正确的建立一个网站的Index页面
建立每个网站时,创建网站的index页面是首要作的事情之一。若是你是一个PHP新手,在编写index页面时典型的作法是只对index页面所需的内容进行编程,其它连接建立另外一个页面。不过,若是想学习一种更高效的方式来实现PHP编程,能够采用“index.php?page=home”模式,许多网站都在采用这种模式。
二、使用Request Global Array抓取数据
实际上咱们没有任何理由使用$_GET和$_POST数组来抓取数值。$_REQUEST这个全局数组可以让你获取一个get或form请求。所以,多数状况下解析数据的更高效代码大致以下:
- $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 0;
三、利用var_dump进行PHP代码调试
若是你在寻找php调试技术,我必须说var_dump应该是你要找的目标。在显示php信息方面这个命令能够知足你的全部须要。而调试代码的多数状况与获得PHP中的数值有关。
四、PHP处理代码逻辑,Smarty处理展示层
Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将本来与HTML代码混杂在一块儿PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员从新修改页面不会影响到程序的程序逻辑,这在多人合做的项目中显的尤其重要。
五、的确须要使用全局数值时,建立一个Config文件
动辄建立全局数值是一种糟糕的作法,不过有时候实际状况的确又须要这么作。对于数据库表或数据库链接信息使用全局数值是一个不错的想法,但不要在你的PHP代码中频繁使用全局数值。另外,更好的一种作法是把你的全局变量存放在一个config.php文件中。
六、若是未定义,禁止访问!
若是你正确的建立了页面,那么任何其余人没有理由访问index.php或home.php以外的index.php页面。一旦index.php被访问后,你能够经过得到变量的方式来打开须要的页面。你的index页面应该包含相似的如下代码:
- define('yourPage',1);
而后,其它页面应该包含:
- if (!defined('yourPage')) die('Access Denied');
这么作的目的是防止直接访问你的其它php页面。这样,任何试图不经过index.php访问其它网页的人,将获得“访问被拒绝”的消息。
七、建立一个数据库类
若是你正在进行数据库编程(在PHP中很是常见的任务),一个不错的想法是建立一个数据库类来处理任何数据库管理功能。示例代码以下:
- public function dbExec($query)
-
- {
-
- $result = $this->db->exec($query);
-
- if (PEAR::isError($result))
-
- errorRedirect($result->getMessage(), true);
-
- else
-
- return $result;
-
- }
这个函数仅接收一个查询语句并对其执行。它还处理可能出现的任何错误。你还能够在这儿包含审核代码,不过我更喜欢使用一个相似的审核函数:
-
-
- function sanitizeInput()
-
- {
-
- $numargs = func_num_args();
-
- $arg_list = func_get_args();
-
- for ($i = 0; $i < $numargs; $i++) {
-
- if (!is_numeric($arg_list[$i]) || $arg_list[$i] < 0)
-
- errorRedirect("Unexpected variable value", true);
-
- }
-
- }
八、一个php文件处理输入,一个class.php文件处理具体功能
不让代码变得混乱的一个重要方法是:获取用户输入后,将其重定向到其它函数来进行处理。原理很是简单,php文件得到咱们须要的任何输入,而后将其执行重定向到类文件中的一个函数。举例来说,假设有一个相似“index.php?page=profile&action=display”的URL。由profile.php来检索该网址并获得操做是“display”。而后使用一个简单的switch函数,咱们来执行真正的显示函数:
- require_once PROJECTROOT.'libs/messages.class.php';
-
- $message = new Message();
-
- switch ($action)
-
- {
-
- case 'display':
-
- $message->display();
-
- break;
-
- ...
如上所示,我使用了一个消息类,而后开始进行switch检查。$message只是被类中的调用函数使用的一个对象。
九、了解你的SQL语句,并老是对其审查(Sanitize)
正如我之前所提到的,任何php网站中最重要的部分有99%的多是数据库。所以,你须要很是熟悉如何正确的使用sql。学会关联表和更多高级技术。下面我将展现一个使用MySQL的函数示例,并使用本文第7条函数进行审查。
- private function getSentMessages($id)
-
- {
-
- $this->util->sanitizeInput($id);
-
- $pm_table = $GLOBALS['config']['privateMsg'];
-
- $users = $GLOBALS['config']['users'];
-
- $sql = "SELECT PM.*, USR.username as name_sender FROM $pm_table PM, $users USR
-
- WHERE id_sender = '$id' AND sender_purge = FALSE AND USR.id = PM.id_receiver AND is_read = TRUE
-
- ORDER BY date_sent DESC";
-
- $result = $this->dbQueryAll($sql);
-
- return $result;
-
- }
首先,咱们对用户输入进行检查(经过一个GET变量传递消息id),而后咱们执行咱们的SQL命令。注意这儿SQL的用法。你须要了解如何使用别名和关联表。
十、当你只须要一个对象时,使用单例模式
在PHP中至关常见的一种情形时,咱们只须要建立一个对象一次,而后在咱们的整个程序中使用它。一个很好的例子就是smarty变量,一旦被初始化后就能够在任何地方使用。这种情形的一个很好实现方案就是单例模式。示例代码以下:
- function smartyObject()
-
- {
-
- if ($GLOBALS['config']['SmartyObj'] == 0)
-
- {
-
- $smarty = new SmartyGame();
-
- $GLOBALS['config']['SmartyObj'] = $smarty;
-
- }
-
- else
-
- $smarty = $GLOBALS['config']['SmartyObj'];
-
- return $smarty;
-
- }
注意,咱们拥有一个全局smarty变量(该示例中它在config.php中被初始化),若是它的值为0,咱们将建立一个新smarty对象。不然,它意味着该对象已经被建立,咱们只须要返回它。