七、类和对象
1、如果用echo或print语句输出一个对象,PHP就会调用这个对象的__toString()方法,如下:
class Person
{
protected $name;
protected $email;
public function setName( $name )
{
$this->name = $name;
}
public function setEmail( $email )
{
$this->email = $email;
}
public function __toString()
{
return "$this->name email>";
}
}
$rasmus = new Person;
$rasmus->setName( "linglongwunv" );
$rasmus->setEmail( "linglongwunv@gmail.com" );
print $rasmus;
?>
输出如下:
linglongwunv linglongwunv@gmail.com
2、PHP5拷贝的是对象的引用而不是值。当把一个现存的对象指定给一个新变量时,新变量中保存的只是这个现存对象的引用。而不管是通过新变量还是旧变量来访问这个对象,都会得到相同的结果。要拷贝对象的值,要使用clone:
$rasmus = clone $zeev;
?>
3、使用魔术方法——__get()和__set()来拦截对属性的请求。
4、调用父类构造器parent::__construct();,这种简化得益于PHP5对构造器实行的一致的命名方案。
5、pathinfo():返回一个关联数组包含有文件路径的信息,包括一下数组单元:dirname,basename和extension。
6、is_resource():检测变量是否为资源类型。
7、func_num_args():返回函数的参数个数,用在函数内部,5.3后在include中返回错误。
8、即使以下代码中的语法结构对于非常量表达式而言是合法的(如$class->pi),但对于常量仍然会产生错误解析:
class Constants
{
const pi = 3.14159;
}
$class = 'Constants';
print $class::pi;
?>
9、为获得对类的快速预览,调用Reflection::export():
Reflection::export( new Reflection( 'Person' ) );
?>
静态方法Reflection::export()将一个ReflectionClass类的技巧作为参数,返回了丰富的信息。
10、使用__autoload()魔术方法在对象技巧化期间自动地加载类文件,下面是如何在脚本中包含所有需要的类的实例:
function __autoload( $class_name )
{
include "$class_name.php";
}
$person = new Person;
?>
这样,当我们技巧化一个new Person时,它就会在包含路径中查找并加载Person.php文件。但是,如果Person.php再次使用__autoload会产生错误。
八、Web基础
1、Cookie是随着HTTP头部一起发送的,所以如果没有使用输出缓冲,那么必须在生成任何输出之前调用setcookie()。
(1)如果setcookie()的第三个参数丢失了(或留空),那么cookie就会在浏览器关闭的时候过期。
(2)setcookie()的第四个参数是一个路径,只有在被请求的页面路径以指定的字符串开头的情况下,cookie才会被发送会服务器。
(3)setcookie()的第五个参数是一个域名。只有当被请求页面的主机名以指定的域名结尾时,cookie才会被发送回服务器。例如:
setcookie('flavor','chocolate chip','','','.example.com');
setcookie('flavor','chocolate chip','','','linglongwunv.example.com');
?>
如果上面设置的第一个cookie中只使用了example.com而不是.exaple.com,那么这个cookie只能发回到唯一的主机example.com(而不是www.example.com或linglongwunv.example.com)。如果在调用setcookie()时没有指定域名,那么浏览器则只有在请求的主机名与设置cookie的主机名相同时,才会发回cookie。
(4)setcookie()的最后一个可选参数是一个安全标记,如果将其设为true,表示浏览器只能以SSL连接的方式发送cookie。如果cookie中包含敏感的信息,使用这个选项会有一些用处,但是不要忘了cookie中的数据可能仍然是以未加密的纯文本形式保存在用户的计算机上。
(5)在调用setcookie()时在第二个参数的位置使用空值,并传递一个已经过期的时间参数,可以删除cookie。
2、get_browser()只能告诉你浏览器是否支持那些功能,而不会告诉你用户是否关闭了该功能。
3、http_build_query():生成URL-encode之后的请求字符串。
4、flush()函数会把PHP内部缓冲的所有输出发送到web服务器,而web服务会在数据到达浏览器之前提供它自己的内部延迟缓冲。
九、表单
1、PHP表单处理应用程序中很重要的两个步骤:数据验证(保证输入的信息对程序而言是可以接受的)和输出转义(保证恶意用户不会利用你的网站攻击其他的网站)。
2、使用isset()、strlen()、is_array(),以便完成最严格的表单验证。
3、用ctype_digit()验证数字:
(1)$_GET和$_POST中的值始终是字符串。
(2)要保证在将值传递给ctype_digit()之前,要先验证一下输入是否为空。
(3)ctype_digit()不是很灵活,只能用于验证数字,对于负数和小数无能为力。
(4)ctype_digit()函数不论比类型转换还是比正则表达式的速度都要快得多,所以如果该函数能满足的你的需要,它还是首选。
4、strval():获取变量的字符串值。
(1)使用非常简单的正则表达式的效率与使用类型转换函数是没有什么差别的。
(2)正则表达式也可以处理PHP无法在不损失精度的前提下保存的有效浮点数。
5、Web浏览器不会让你自己在下拉菜单中生成选项,虽然如此,也要记住发送到你的PHP程序的请求不一定来自一个行为规范的浏览器。即使在多数用户不会出现差错的环境中,也需要验证输入。
6、array_intersect():计算数组的交集。返回一个数组,该数组包含了所有在array1中也同时出现在所有其它参数数组中的值,键名保留不变。
7、使用uniqid()和md5函数在表单中插入一个值为唯一ID的字段。
8、如果有一个表单输入元素名字为linglong.wunv,那么在PHP中就需要以$_GET['linglong_wunv']或$_POST['linglong_wunv']来访问它。