PHP是一门弱类型语言,定义的变量随着上下文的改变类型可能变来变去,这有利有弊。
从PHP5.0开始,可以强制约束变量的类型,比如对象,数组,整形等等。具体参考手册。比如:
<?php
class A{}
funtion test(A $a)
{
// 约束参数$a必须是A类的对象
//也可以改成array $a,必须是数组
//也可以改成stdClass $a,必须是对象(stdClass只是zend的一个保留类,并不是所有类的基类)
//也可以改成 callable $a,必须是回调类型
}
如果传入的参数跟约束的类型不一样,会出现一个致命的错误。如果不希望这种错误影响到代码的继续运行,可能就需要自定义错误处理函数了。
set_error_handler是php允许用户自己处理错误提示的函数。具体参考手册。
<?php
/*
自定义函数样式 :handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )
第一个参数 errno,包含了错误的级别,是一个 integer。
第二个参数 errstr,包含了错误的信息,是一个 string。
第三个参数是可选的,errfile, 包含了发生错误的文件名,是一个 string。
第四个参数是一个可选项, errline, 包含了错误发生的行号,是一个 integer。
第五个可选参数, errcontext, 是一个指向错误发生时活动符号表的 array。 也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。 用户的错误处理程序不应该修改错误上下文(context)。
*/
function myHandler($no,$str,$file,$line.$context){
if($no == E__ERROR)
{
//....
}
}
set_error_handler("myHandler", null);
// 也可以用对象传入,set_error_handler(array($this, "myHandler"), null);
// 第二个参数类似error_reporting()的功能,设置哪些错误发生时,会触发自定义函数
今天解bug时,遇到这么一个判断表达式,$a == 0,$a是个字符串,刚开始没多想以为0等同false,只要$a不为空值,这个等式就不成立,但是var_dump一下发现竟然是true,很纳闷,后来查了一下,恍然大悟:PHP是弱类型,在比较的时候会根据语意自动转换变量的类型,比如0 == “hello”,会先把”hello”转成int类型即为0,所以这里是true。php中的严格应该用恒等于===去作比较,保证值和类型都一样。