Lzp729@Blog
道法自然
Browse: Home / PHP

PHP

Zend框架之Session库

By lzp729 on December 14, 2009

说到Zend的Session库, 不得不先详细了解一下PHP的Session是如何实现的, 首先要知道一点, 就是不同的web脚本语言或者不同的服务端都可能采取不同的方式来实现Session. 我这里的测试环境是XAMPP 1.7.2, 其中的Apache是2.2.12版. 设置一个测试PHP页面, 代码如下

<?php
session_start();
setcookie("user", "Alex Porter", time()+3600);
 
if(isset($_SESSION[’views’]))
$_SESSION[’views’]=$_SESSION[’views’]+1;
 
else
$_SESSION[’views’]=1;
echo "Views=". $_SESSION[’views’];
?>

监听捕获浏览器与服务器之间的http数据:
Step1. 客户端首次访问该页面得到
Step2. 客户端再次访问该页面得到
在Step1中, 注意到客户端首次是没有任何session或者cookie数据发送到服务器的, 而此时服务端的session_start()函数检查发送的http头, 没有发现session相关的值(也就是下面要提到的PHPSESSID值), 于是服务端随机产生了一个Session ID, 并在服务端的线程池中建立一个新的线程, 并将该Session ID与该Session所保存的值相关联, 然后在Step2中服务器通过http头Set-Cookie字段设置了我预设的cookie值views和随机生成的Session ID(PHPSESSID)值, 而在Step2, 也就是不关闭浏览器直接刷新该页面后, 发现浏览器将本地cookie中的views和PHPSESSID两个值都发送到了服务器, 服务端接受到请求后, 获取PHPSESSID的值, 然后在服务端的Session池中查找客户端发送来的Session ID(在这里是64t6plpgl44jbd7fm0h9akspv1), 发现与该ID相关的变量views, 且其值为1, 然后我的代码的效果使得该值自增为2, 于是服务端返回views=2. 其中值得注意的是, 客户端的cookie不仅仅保存着我设置的cookie值, 还保存着服务端生成的Session ID, 而与该Session ID相关的变量及其值, 均保存在服务端的线程池中. 由此可见, 如若我们的浏览器不支持cookie, 那么Apache 2.2.12的PHP Session将无法使用. 实际上在别的语言实现中, 如JSP, [...]

Posted in Zend框架 | Tagged PHP, Session, Zend框架 | Leave a response

Zend框架之ACL库

By lzp729 on September 3, 2009

Zend框架的ACL库的结构图

Zend的ACL库其实只有两个主要类, Zend_Acl_Role_Registry和Zend_Acl.

Zend_Acl_Role_Registry类定义了Role相关的数据结构和操作函数并负责存储和管理Role之间的父子关系. 具体实现上, Role使用一个关联数组做底层数据结构, 关联数组的key是当前Role的ID值, 关键数组的value又是一个关联数组, 仅包括设计好三段关联数据, 这三段关联数据分别是instance表示当前Role的实体, parents表示父Role的关联数组(该关联数组的key的父Role的ID, value是父Role的实体), children表示子Role的关联数组(该关联数组的key的子Role的ID, value是子Role的实体). 观察这个设计, Zend作者并没有使用常见的二叉树形式来作为底层数据结果, 而这样做的原因正是由php这门的特点做决定的, php的数组的自由度大, 对象复制以引用复制方式完成, 这样一来, 足以得到足够的可靠性和效率, 并充分简化了实现难度, 可见作者OO功底很深, 当然了, 我是php新手, 这样的设计也让我受益匪浅.操作函数上, 主要提供了增(add), 删(remove, removeAll), 查(has,inherits)和获取(get,getParents)的操作, 参数均已RoleID为参数, 要注意的是inherits函数可用于查询间接父子Role关系, 即父子Role不必是直接父子关系, 这这样的行为时通过inherits函数的第三boolean参数来控制的.
Zend_Acl类更是将php的关联数组能力发挥到极致, 在此类中, 封装了对resource相关的数据结果和操作函数并负责存储和管理resource之间的父子关系, 其实实现上resource与role的实现可所完全相同, 不同的仅仅是名字而已, 另外Zend_Acl类还对Role类的共有函数进行了一次重新封装, 基本上就是换了个函数的名字而已, 在C++中, 其实这种封装方式表示了Zend_Acl私有继承Zend_Acl_Role的意义.接下来最为核心的就是Zend_Acl实现的权限管理. 事实上, Zend_Acl采取了模拟NTFS文件系统的权限管理的机制. 在NTFS文件系统中, 在每一个分区中的开始段有一定大小的空间存储着该分区的访问控制列表(ACL), 该列表为每一个资源定义某个自定角色或角色组的访问规则. 而在Zend_Acl类中, 实现了一个复杂关联数组来模拟二叉树的数组结构, 并提供了相应的算法来完成查找工作. 具体来说, 访问控制规则数组rule定义了所有resource, role之间的访问规则, 具体数据结果如下图:
这个图只是一个粗略的说明,其实所有以All开头的元素都是表示默认的访问权限,也就是说,如果没有显式指定role,resource的访问规则的时候将采取的默认的方式,而所有以By开头的元素就是存储这些指定规则的位置, 例如ByResourceID表示一个关联数组, 而这个关联数组的key的Resource的ID, 而value是Resource的下级节点Role的规则,也就是说这个value内含有AllRoles和ByRoleID, [...]

Posted in Zend框架 | Tagged ACL, PHP, Zend框架 | Leave a response

PHP知识整理 (9) PHP访问数据库

By lzp729 on July 4, 2009

面向对象的方式:
@ $db = new mysqli(‘host’,’db’,’user’,’password’)
$db -> select_db(‘db’)
mysqli_connect_errno()
$query
$result = $db -> query($query)
$rowNumber = $result -> num_rows
$row = $result -> fetch_assoc()
$row['id']
$result -> affected_rows
$result -> free()
$db -> close()
面向过程的方式:
@ $db = mysqli_connect(‘host’,’db’,’user’,’password’)
mysqli_select_db($db, ‘db’)
$query
$result = mysqli_query($db, $query)
$num_rows = mysqli_num_rows($result)
$row = mysqli_fetch_assoc($result)
mysqli_affected_rows
mysqli_free_result($result)
mysqli_close($db)
MDB2方式
$dsn = “mysqli://user:password@host/db”
$db = &MDB2::connect($dsn)
MDB2::isError($db)
prepared方式
$query = “insert into books value(?, ?)”
$stmt = $db -> prepare($query)
$stmt -> bind_param(‘id’,’name’)
$stmt -> execute()
$stmt -> [...]

Posted in PHP知识整理 | Tagged PHP, 数据库, 知识整理 | Leave a response

PHP知识整理 (8) 错误和异常处理

By lzp729 on July 3, 2009

try…catch结构同C++.
可以串联多个catch捕捉不同类型的异常.
自定义异常类应该从Exception类继承, 此时如果Exception作为catch的捕获类型, 将捕获继承类对象, 说明PHP基类对象形参可以被子类实参调用, 同C++基类指针用法.
@符号压制错误信息, 例如fopen打开不存在的文件等, 但不会压制异常的抛出.

Posted in PHP知识整理 | Tagged PHP, 异常, 知识整理 | Leave a response

PHP知识整理 (7) 面向对象的PHP

By lzp729 on July 2, 2009

PHP访问限制使用public(默认), protected和private. 仅支持类成员和类函数的访问控制, 不支持继承方式的控制.
构造函数__construct(), 析构函数__destruct(), 访问器__get()和__set(), __call()重载函数, __autoload()在初始化对象前自动载入某些需要的文件, __toString()自动转换成string. __clone()方法相当于C++的copy-constructor.
extend关键字继承, 对于受访问控制父类的成员和函数, 在子类中的访问性同C++. PHP默认支持多态.
final关键字限制类禁止被继承或重载. abstract关键字指定类为抽象类, 不能被实例化, abstract关键字指定类函数为抽象函数, 无需提供定义.
类内部使用$this->访问内部成员或函数,使用parent::显式访问父类成员.
PHP不支持多重继承, 但提供了类似java的接口机制interface. 接口中仅提供函数声明即可.
pre-class: 将类成员定义为const, 类外部使用::直接访问.
static静态函数, 类外部使用::直接访问.
instanceof检查变量是否为某个类的对象.
foreach迭代访问类内的每个成员.
反射ReflectionClass
对于__clone()函数, 其内部默认的$this指针, 指的是clone等式左端的要得到的对象, 其实并不存在有些实例中的$that指针, 这个错误已确证来自于国内的一本权威php杂志的一篇文章, 但其实并不存在该指针, 事实上,对于__clode()函数理解应该是当php解析到$a = clone $b时, 首先完成了按位复制操作, 然后再在函数体内通过$this来规避按位复制的问题, 在这一点上php与C++的处理方式是完全不同的, 简而言之, php是先用被clone对象按位复制到新对象, 然后来改变, 而C++则是从初始化的初期就由程序员控制.
PHP4中类对象默认是按值传递, 而PHP5默认是按引用传递.
PHP构造函数和析构函数不能自动调用父类的构造或析构函数.

class example:

interface itfc
{
function output();
}
 
abstract class A
{
abstract function foo();
}
 
class B extends A implements itfc
{
function __autoload()
{
include("file.inc");
echo "autoload in [...]

Posted in PHP知识整理 | Tagged PHP, 知识整理, 面向对象 | Leave a response

Next »

PHP

  • Zend框架之Session库
  • Zend框架之ACL库
  • PHP知识整理 (9) PHP访问数据库
  • PHP知识整理 (8) 错误和异常处理
  • PHP知识整理 (7) 面向对象的PHP
  • PHP知识整理 (6) 代码重用与函数编写
  • PHP知识整理 (5) Perl正则表达式
  • PHP知识整理 (5) POSIX正则表达式
  • PHP知识整理 (4) 字符串操作
  • PHP知识整理 (3) 使用数组
  • PHP知识整理 (2) 数据的存储和检索
  • PHP知识整理 (1) 基础

Copyright © 2012 Lzp729@Blog.

Powered by WordPress and Hybrid, Theme By Lzp729.

RSS feed Site Map