PHP返回变量或数组的字符串表示:var_export()

本文详细对比了PHP中的var_dump与var_export两个函数的功能差异。var_dump用于打印变量的相关信息,包括类型和值;而var_export则返回变量的字符串表示形式,且能返回合法的PHP代码。文章还特别指出了当处理资源类型变量时两者的不同表现。

php中var_export与var_dump的区别分析,在大多数情况下,多用var_dump来输出,因为它也输出了数据类型。

一 var_dump 
(PHP 3 >= 3.0.5, PHP 4, PHP 5) 
var_dump -- 打印变量的相关信息 
描述 
void var_dump ( mixed expression [, mixed expression [, ...]] ) 

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 

复制代码代码如下:

$data = array ('name' => 'abc', 'job' => 'programmer','a'=>array('aa','cc','bb')); 
$data = var_dump($data,TRUE); 
echo $data; 

输出形式如下: 
复制代码代码如下:

array(3) { 
["name"]=> 
string(3) "abc" 
["job"]=> 
string(10) "programmer" 
["a"]=> 
array(3) { 
[0]=> 
string(2) "aa" 
[1]=> 
string(2) "cc" 
[2]=> 
string(2) "bb" 


bool(true) 

二 var_export 
(PHP 4 >= 4.2.0, PHP 5) 
var_export -- 输出或返回一个变量的字符串表示 
描述 
mixed var_export ( mixed expression [, bool return] ) 

此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。 
您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。 
EG: 
var_export(array('a','b',array('aa','bb','cc'))) 这种与VAR_DUMP没什么区别; 

$var =var_export(array('a','b',array('aa','bb','cc')),TRUE),加上TRUE后,不会再打印出来,而是给了一个变量,这样就可以直接输出; 
echo $var;此时输出来的形式与var_dump()打印的相似。 
EG2 
复制代码代码如下:

$data = array ('name' => 'abc', 'job' => 'programmer','a'=>array('aa','cc','bb')); 
$data = var_export($data,TRUE); 
echo $data; 

输出形式如下: 
复制代码代码如下:

array ( 
'name' => 'abc', 
'job' => 'programmer', 
'a' => 
array ( 
0 => 'aa', 
1 => 'cc', 
2 => 'bb', 
), 



以下是补充资料: 
error_log(var_export(yblog_mspconfiginit("ratings"),true)); 
问题原因 
var_export必须返回合法的php代码, 也就是说,var_export返回的代码,可以直接当作php代码赋值个一个变量。而这个变量就会取得和被var_export一样的类型的值。但是, 当变量类型为resource的时候, 是无法简单copy复制的,所以, 当var_export的变量是resource类型时, var_export会返回NULL. 

问题发现 
在跟踪yratings_get_targets的时候, 
复制代码代码如下:

error_log(var_export(yblog_mspconfiginit("ratings"),true));老是打印出yblog_mspconfiginit(“ratings”)的返回是NULL 

导致我以为是无法建立和DB的连接,走错路了一天。 

最后才发现,这是var_export和var_dump的区别之一 

这就是: 

问题原因 
var_export必须返回合法的php代码, 也就是说,var_export返回的代码,可以直接当作php代码赋值个一个变量。 而这个变量就会取得和被var_export一样的类型的值 

但是, 当变量类型为resource的时候, 是无法简单copy复制的,所以, 当var_export的变量是resource类型时, var_export会返回NULL 
实例 
复制代码代码如下:

$res = yblog_mspconfiginit("ratings"); 
var_dump($res); 
var_export($res); 

结果: 
复制代码代码如下:

resource(1) of type (yahoo_yblog) 

NULL再比如: 
复制代码代码如下:

$res = fopen('status.html', 'r'); 
var_dump($res); 
var_export($res); 

结果: 
复制代码代码如下:

resource(2) of type (stream) 
NULL 

### `var_export` 函数的作用及用途 #### 作用 `var_export` 函数用于返回变量字符串表示形式,可以用于调试、日志记录生成代码片段。其输出格式与 PHP 代码兼容,能够直接复制粘贴到 PHP 文件中作为变量赋值使用。与 `print_r` 不同的是,`var_export` 生成的输出是合法的 PHP 语法,适合用于代码生成变量序列化场景。 例如,对于数组对象,`var_export` 会返回其结构化的字符串表示,便于查看和调试变量内容。 #### 使用方式 `var_export` 的基本语法如下: ```php var_export(mixed $expression, bool $return = false): mixed ``` - 第一个参数为要导出的变量。 - 第二个参数决定是否返回结果,若为 `true`,则 `var_export` 返回字符串形式的变量表示;若为 `false`,则直接输出结果。 示例: ```php $data = [ 'name' => 'Alice', 'age' => 25, 'is_active' => true ]; // 输出变量结构 var_export($data); // 获取变量结构的字符串表示 $exported = var_export($data, true); file_put_contents('data.php', "<?php\n\$data = $exported;"); echo $exported; ``` 上述代码中,`var_export` 被用于将数组 `$data` 转换为可执行的 PHP 代码,并保存到文件中,便于后续读取调试。 #### 应用场景 - **调试与日志记录**:在开发过程中,`var_export` 可用于输出变量结构,帮助开发者快速定位问题。 - **代码生成**:通过将变量结构导出为字符串,可以动态生成 PHP 文件,实现配置文件缓存文件的自动构建。 - **数据持久化**:将变量结构保存为可执行代码,便于在不同环境中复用。 #### 与其他函数的区别 - `var_export` 与 `print_r` 类似,但 `var_export` 的输出是合法的 PHP 语法,而 `print_r` 的输出仅用于展示,不适用于代码生成。 - 相较于 `json_encode`,`var_export` 不仅支持数组和对象,还能处理资源类型等复杂结构,并保持原始类型信息。 #### 注意事项 - 对于对象,`var_export` 会尝试导出其属性,但不会导出方法。 - 若变量中包含循环引用(如对象之间相互引用),`var_export` 可能无法正确导出结构。 #### 示例输出 对于如下变量: ```php $data = [ 'id' => 1, 'tags' => ['php', 'web', 'development'], 'metadata' => (object)['created_at' => '2023-01-01'] ]; ``` 使用 `var_export` 输出: ```php array ( 'id' => 1, 'tags' => array ( 0 => 'php', 1 => 'web', 2 => 'development', ), 'metadata' => stdClass::__set_state(array( 'created_at' => '2023-01-01', )), ) ``` 此输出可直接复制至 PHP 文件中作为变量赋值语句使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值