1、变量的判断和地位
- 变量和条件逻辑是计算机程序之所以如此强大和灵活的核心。PHP是弱类型语言,不用事先定义变量类型,而是根据变量值来确定变量类型。
- 已赋值的变量就是已设置的变量,无论是true还是false,也无论为空。
- 对于变量的定义与删除,可以用isset()和unset()函数。
//isset()传入一个已经设置的变量时,就会返回true,无论变量的值为不为false
$a = false;
echo isset($a);
//将一个变量变为未设置,可以使用unset或者将其值设置为null
$b = 'hello';
unset($b);
$c = 'hi';
$c = null;
//empty()可以判断一个变量是否为空
//常见的空值有0,0.0,“”,“0”,array(),false,NULL等
if(empty(''){})
2、避免混淆 == 和 =
问题:
不想比较一个变量和一个常量时意外地赋值。
解决方案:
左边使用常量,右边使用变量
示例
//应当使用,如果写成 =,就会报错
if(12 == $dwarves){...}
//而不是
if($dwarves == 12){...}
//下面这种情况不会报错,会正常运行,引起不必要的错误
if($dwarves = 12){...}
//如果需要比较两个数据类型和变量值是否相同,应该使用===
if(12 === $dwarves){...}
扩展:= 的有关文档http://www.php.net/operators.assignment
3、建立一个默认值
问题:
希望为一个还没有值得变量赋一个默认值,如果希望变量有一个硬编码的默认值,这个值可以被用户输入值覆盖或者通过一个环境变量覆盖,经常会这么做。
解决方案:
使用isset() 函数为一个可能已经有值的变量赋一个默认值。
示例
if(! isset($cars)){
$cars = $default_cars;
}
//使用三元表达是为一个新变量赋一个(可能默认的)值
$cars = isset($_GET['cars']) ? $_GET['cars']:$default_cars;
//检查数组使用array_key_exists()函数
$car = array_key_exists('cars',$_GET)?$_GET['cars']:default_cars;
//它和isset的区别在于,键存在但值为null时,isset返回为false,而自己为真。
扩展:isset的有关文档http://www.php.net/isset
4、交换值而不使用临时变量
问题:
希望交换两个变量的值,但不使用额外变量来存储临时值。
解决方案:
使用list() 函数来交换。
示例
//list()构造允许从一个数组想单个变量赋值
$a = 'a';
$b = 'b';
//这个方法只是为了使代码更加清晰,而不能提升速度
list($a,$b)=array($b,$a);
扩展:list()的有关文档http://www.php.net/list
5、创建动态变量名
问题:
希望动态构造一个变量名。例如,希望所使用的变量名与数据库查询中字段名匹配。
解决方案:
使用可变变量,就是在变量之前增加一个$前缀。
示例
$animal ='turtles';
$turtles = '103';
//先将右侧的变量解析变成值,再将其值变成一个变量。
print $$animal;
//可以通过{}来构造更复杂的表达式
foreach($stooges as $s){
print "$s's real name was ${'stooge'.strtolower($s)}";
}
//但是一定要确保不能产生歧义,例如,不能区分$donkeys和$donkeys[12]
$$donkeys[12];
6、跨函数调用持久存储局部变量的值
问题:
希望一个局部变量能够在函数调用之间保留它的值。
解决方案:
将变量声明为static。
示例
function track_times_called(){
static $i =0;
$i++;
return $i;
}
print track_times_called(); //输出为1
print track_times_called(); //输出为2
//在一个函数中,函数会记住这个变量的值,但是只在一次脚本调用期间有效。
扩展:static 的有关文档http://www.php.net/language.variables.scope
7、将复杂的数据类型封装在字符串中
问题:
希望得到一个数组或对象的字符串表示,以便存储在一个文件或数据库中,这个字符串应该可以很容易地重新构造元数组或对象。
解决方案:
使用serialize()或者json_encode()。
示例
//serialize()适用于PHP内部,编码不易被读懂,但是解码速度快。
$array = array('sugar' => '2 lbs.','butter' => '3 sticks');
$str_en = serialize($array);
print $str_en;
unserialize($str_en);
//json_encode()适用于PHP与其他接口交互,编码简单,解码速度稍慢。
$array = array('sugar' => '2 lbs.','butter' => '3 sticks');
$str_en = json_encode($array);
print $str_en;
//json_decode中第二个参数true,表示解析成一个关联数组,否则默认解析成对象。
json_decode($str_en,true);
//输出
a:2:{s:5:"sugar";s:6:"2 lbs.";s:6:"butter";s:8:"3 sticks";}
{"sugar":"2 lbs.","butter":"3 sticks"}
扩展:json_encode() 的有关文档http://www.php.net/json_encode
8、变量内容转存为字符串
问题:
希望检查变量中存储的值。这可能是一个复杂的嵌套数组或对象,所以不能直接打印循环处理。
解决方案:
使用var_dump()、print_r()或者var_export()。
示例
$info = array('name'=>'frank',12.6,array(3,4));
//var_export函数会生成合法的PHP代码,执行这个代码可以定义导出变量。
//print_r()和var_export()都可以接受第二个参数,用变量来保存输出值。
$str1 = print_r($info,true);
$str2 = var_export($info,true);
//var_dump()得到输出,需要使用输出缓冲:
ob_start();
var_dump($user);
$dump = ob_get_contents();
ob_end_clean();
//这样就使得var_dump的内容放到了$dump中
var_export($info);
//输出
array(
'name' => 'frank',
0 =>12.6,
1 =>array(
0 =>3,
1 =>4
)
)
扩展:var_export() 的有关文档http://www.php.net/var_export