文章目录
环境
- PHP 8.4.5
总结
如果不想看详细介绍,可以直接看总结。
打印语句
echo
:- 最常用,最推荐的打印语句
- 不是函数,括号可有可无(个人建议不加括号)
- 可以打印多个值,用逗号分隔
print
:- 不是函数,括号可有可无(个人建议不加括号)
- 总是返回
1
- 只能打印一个值
- 性能略差于
echo
print_r
:- 调试常用
- 特别适合打印数组、对象等复杂的数据结构
- 若把第二个参数设置为true,则并不打印,而是返回要打印的内容(字符串)
var_dump
:- 调试常用
- 比
print_r
显示更多详细信息,比如数据类型、字符串长度,等等 - 没有返回值
- 可以打印多个值,用逗号分隔
换行符
- 命令行
PHP_EOL
(推荐)\n
- 字符串本身跨行
- 网页
<br>
(或者<br/>
)nl2br()
结合PHP_EOL
或\n
<pre>...</pre>
结合PHP_EOL
或\n
nl2br()
和 <pre>...</pre>
的区别:
- 前者会把行尾的空格转(若有多个)换为1个空格,把行首的空格都去掉,而后者会保留所有空格
- 前者是plain text,后者是等宽字体
<pre>...</pre>
有点像markdown里的引用代码(严格保留缩进格式,使用等宽字体)。
括号
echo
和 print
不是函数,括号可有可无。个人建议不要加括号,因为括号非但不起作用,反而会误导人。
数组(对象)和字符串之间的相互转换
json_encode
:把对象或者数组转换为JSON格式的字符串json_decode
:把JSON格式的字符串转换为对象或者数组implode
:把数组元素连接成一个字符串explode
:把字符串分割为数组
打印语句
PHP常见的打印语句有:
echo
print
print_r
var_dump
下面详细介绍一下。
echo
echo
是最简单的打印语句。
echo "Hello World";
或者
echo("Hello World");
关于有没有括号的区别,下面会有详细介绍。
注意:echo语句的输出结果不会自动换行。比如:
echo("abc");
echo("def");
- 在命令行下输出:
PS C:\xampp\htdocs> php test1.php
abcdef
- 在网页上输出:
如果需要换行的话,在命令行下和网页下的方法有所不同。
要在命令行输出换行,推荐使用 PHP_EOL
:
echo("abc" . PHP_EOL ."def");
或者也可以用 \n
(兼容性没有 PHP_EOL
好):
echo("abc\ndef");
还有一种方法是直接在字符串里换行:
echo("abc
def");
注:单引号和双引号都可以。
上面这几种换行方式只对命令行有效,在页面里,它们只会转化为一个空格,比如:
要想在页面上实现换行,需要使用 <br>
(或 <br/>
)标签:
echo("abc<br>def");
或者使用 nl2br()
来转换:
echo(nl2br("abc\ndef"));
echo(nl2br("abc" . PHP_EOL . "def"));
或者使用 <pre>...</pre>
来保留格式:
echo("<pre>abc\ndef</pre>");
echo("<pre>abc" . PHP_EOL . "def</pre>");
对于 <pre>...</pre>
,字体会有些不太一样:
而且 <pre>...</pre>
会保留行首和行尾的空格。
echo语句可以打印多个值,用逗号分隔,比如:
echo "abc", "def";
输出结果里, abc
和 def
是连着的。
注:不能用括号的方式打印多个值。
print
和 echo
很类似,区别在于:
print
有返回值1
,而echo
没有返回值(但是有返回值又有什么用呢?)print
无法打印多个值print
性能略低于echo
(但差别不大)
总之,推荐使用 echo
。
括号
echo
和 print
不是函数,而是语言结构,所以括号不是必需的。
事实上,括号可能会产生意想不到的作用,看下面的代码:
print ("A") && print ("B");
运行结果是什么?
看起来,输出结果似乎应该如下:
AB
但其实并不是这样,实际上输出结果为:
B1
这是为什么呢?
原因在于, print
并不是函数,括号其实是不起作用的,完全可以移除。也就是说,上面的代码就相当于:
print "A" && print "B";
根据优先级,该代码也就相当于:
print ("A" && print "B"); // 括号并不起作用,只是为了方便表示优先级
所以,会先打印出 B
,然后再打印出 1
(也就是true)。
问题是,这样的代码:
print ("A") && print ("B");
迷惑性太大了。
由此看来, echo
和 print
语句最好还是别加括号了,因为括号不但不起作用,反而会误导人。
print_r
print_r
和 print
的区别在于,它特别适合打印数组、对象等复杂的数据结构。
$person = ["name" => "Tom", "age" => 25];
print_r($person);
输出结果如下:
Array
(
[name] => Tom
[age] => 25
)
而 print($person)
结果如下:
PHP Warning: Array to string conversion in C:\xampp\htdocs\test1.php on line 5
PHP Stack trace:
PHP 1. {main}() C:\xampp\htdocs\test1.php:0
Array
可见,PHP报了一个warning,然后只打印出了 Array
的字样。
另一个区别在于, print_r
可以有第二个参数,是 bool
类型的,默认值是false。如果设置为true,则并不实际打印,而是返回一个字符串,也就是原本要输出的内容。
print_r
非常适合调试复杂数据(比如数组、对象)。
var_dump
var_dump
和 print_r
类似,区别在于 var_dump
能够显示更多详细信息,比如数据类型、字符串长度,等等。
$person = ["name" => "Tom", "age" => 25];
var_dump($person);
输出结果如下:
array(2) {
'name' =>
string(3) "Tom"
'age' =>
int(25)
}
另外, var_dump
的参数可以是多个,和 echo
类似。
var_dump
没有返回值。
数组(对象)和字符串之间的转换
json_encode
把对象或者数组转换为JSON格式的字符串。
$person = ["name" => "张三", "age" => 25];
$str = json_encode($person);
echo $str;
输出结果如下:
{"name":"\u5f20\u4e09","age":25}
常用选项:
JSON_PRETTY_PRINT
:完美打印(比如换行、缩进等)JSON_UNESCAPED_UNICODE
:不转义 Unicode 字符,使中文等非 ASCII 字符能正确显示
比如:
$person = ["name" => "张三", "age" => 25];
$str = json_encode($person, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $str;
输出结果如下:
{
"name": "张三",
"age": 25
}
json_decode
将JSON格式的字符串转换为数组或对象。
$str = '{"name":"张三","age":25}';
$x = json_decode($str);
echo gettype($x) . PHP_EOL; // object
echo $x->name;
输出结果如下:
object
张三
本例中,把JSON字符串转换为PHP对象。
第二个参数表示是否转换为关联数组,默认值是false,如果设置为true:
$str = '{"name":"张三","age":25}';
$x = json_decode($str, true);
echo gettype($x) . PHP_EOL; // array
echo $x["name"];
输出结果如下:
array
张三
可见,把JSON字符串转换为关联数组。
implode
把数组元素连接成一个字符串。比如:
$arr = ['apple', 'banana', 'cherry'];
$str = implode(', ', $arr);
echo $str; // apple, banana, cherry
如果是多维数组,就不行了:
$arr = ['a', ['b', 'c'], 'd'];
$str = implode(', ', $arr);
echo $str; // a, Array, d
implode
有个别名 join
,显然这个名字更贴切。
explode
把字符串分割为数组,比如:
$str = "apple,banana,cherry";
$arr = explode(',', $str);
print_r($arr);
输出结果如下:
Array
(
[0] => apple
[1] => banana
[2] => cherry
)
注意:对于空字符串( ''
), explode
会返回一个包含空字符串的数组 ['']
。
考一考
关联数组 $arr1
定义如下:
$arr1 = ["name"=>"张三", "age"=>25, "city"=>"北京"];
现在需要调试代码,分别要在命令行和页面上打印 $arr1
的内容,该如何打印?
答:对于命令行,可以直接用 print_r
或者 var_dump
来打印。
print_r
:
print_r($arr1);
输出结果如下:
Array
(
[name] => 张三
[age] => 25
[city] => 北京
)
var_dump
:
var_dump($arr1);
输出结果如下:
array(3) {
["name"]=>
string(6) "张三"
["age"]=>
int(25)
["city"]=>
string(6) "北京"
}
对于网页,用 print_r
或者 var_dump
来打印的话,不会自动换行:
为了方便浏览,可以转化成JSON格式,然后用 <pre>...</pre>
来保持格式:
$x = json_encode($arr1, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "<pre>{$x}</pre>";
注意:此时应该用 <pre>...</pre>
,而不应该用 nl2br()
,因为后者不会保留格式:
注意缩进没了。