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

本文介绍了PHP编程中的实用技巧,包括变量的判断与初始化、避免混淆赋值与比较操作符、动态变量名的创建、函数间变量值的持久化存储、复杂数据类型的字符串表示等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值