文章目录
- 环境
- 总结
- 打印语句
- 换行符
- 括号
- 数组(对象)和字符串之间的相互转换
- 打印语句
- echo
- 括号
- print_r
- var_dump
- 数组(对象)和字符串之间的转换
- json_encode
- json_decode
- implode
- explode
环境
- 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
括号
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>
,字体会有些不太一样:
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; // objectecho $x->name;
输出结果如下:
object
张三
本例中,把JSON字符串转换为PHP对象。
第二个参数表示是否转换为关联数组,默认值是false,如果设置为true:
$str = '{"name":"张三","age":25}';$x = json_decode($str, true);echo gettype($x) . PHP_EOL; // arrayecho $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
会返回一个包含空字符串的数组 ['']
。