PHP经典实例读书笔记--变量

来源:互联网 发布:网络覆盖 新方法 编辑:程序博客网 时间:2024/06/14 03:43

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(); //输出为1print 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

0 0
原创粉丝点击