PHP用户注册系统动手实践

源起

借来一本书,《PHP&MySQL范例精解——创建、修改、重用》。虽然是2008年出版的老书,但对与我这样的新手来说还是挺有帮助的,毕竟那些基本的设计思想是不会过时的。

目录结构设计

书中说,在开发过程中第一步是设计程序的目录结构。建议创建三个主文件夹,分别用来:

  • public_files:保存可以公共访问的页面;
  • lib:保存可以被其他文件调用的引用文件;
  • templates:保存页面显示文件。

Web服务器只允许访问public_files下的文件,如此一来可以增强系统的安全性。

数据库设计

将使用次数很少甚至只有一次的数据单独存放在一个表中并及时删除,以避免数据冗余。
例如,此书就将用户激活相关的信息单独放在了一个表中。因为这些信息只在激活时用到一次,用完即删。

编写共享代码

将共享的代码及链接数据库的代码分别存在在一个文件中,增加代码的重用度,方便其他文件调用。

User类的设计

在MVC思想中该部分属于model的设计。
在设计一个类的时候应牢记,在面向对象编程中,对象即对应着生活中的实体。类的属性用于描述对象,而类的方法则用于直接操作对象或者做一些与该对象相关的操作。
对于一个用户类而言,首先要有用户ID、用户名、密码等这些用户信息,是为该类的属性。再者,我们需要对用户进行查找、创建、更新信息、激活等操作,于是便有与之对应的方法来完成这些操作。

属性的重载

此书使用了重载的放松来动态地创建属性。这样做的好处是若以后要新增一些属性几乎不用对代码作出改动,直接调用这些需要添加的属性,就行了。
利用重载来动态创建属性与直接再代码中添加一个新的属性是不一样的。属性的重载利用了魔术方法__get()和__set()。在给不可访问属性(未定义或不可见)赋值时,__set()会被调用;在读取不可访问属性的值时__get()会被调用。一般通过__set()将重载的属性的数据保存到一个私有数组字段中,需要读取重载的属性时又通过__get()从这个私有数组字段中读取。示例代码如下:

class User
{
    private $uid;
    private $field;

    //initialize a User object
    public function __construct()
    {
        $this->uid = null;
        $this->field = array('username' => '',
            'password' => '',
            'emailAddr' => '',
            'isActive' => false);
    }

    //override magic method to retrieve properties
    public function __get($field)
    {
        if($field == 'userId'){
            return $this->uid;
        }else{
            return $this->field[$field];
        }
    }

    //override magic method to set properties
    public function __set($field, $value)
    {
        if(array_key_exists($field, $this->field)){
            $this->field[$field] = $value;
        }
    }
}

需要注意的是PHP中的重载与其他语言的不同。其他语言的重载一般是指同函数名称不同参数个数从而实现同名的多个函数。关于PHP重载的更多内容见PHP手册:重载

对数据进行验证

在对数据进行处理之前需要对数据进行验证。当数据验证为是我们期望的那样之后再对数据进行处理。否则可能会出现不可预知的错误。新手往往可能会忽视这一点。
例如在PHP的代码中经常会出现检测某个量是否为空,若非空再进行操作。

动态的SQL语句

实现查找、保存等方法是需要用到动态的SQL语句。此书通过sprintf()函数来实现。sprintf()函数类似与C#中的String.Format()。然而这种方式略繁琐,个人感觉目前会有更好的方式。
当使用sprintf()函数实现动态SQL时,对于较复杂的字符串参数需要使用real_escape_string()函数进行转义,以确保代码的安全性。(编码问题貌似一般和SQL注入有关)。

模板

使用模板可以将逻辑和页面设计分离。此书在这里使用了一个简单的模板:将页面各个部分的内容保存到$GLOBALS数组中,模板文件在各个部分直接输出数组的内容。因此若想动态的展示页面,只需修改$GLOBALS中的内容,再展示模板文件即可。

结语

本文是一篇简单的学习笔记,主要是帮助自己整理思路,如果能对其他人也有一些帮助就更好了~【用markdown写东西确实也挺爽的

你可能感兴趣的:(PHP用户注册系统动手实践)