文章目錄
- 環境
- 總結
- 打印語句
- 換行符
- 括號
- 數組(對象)和字符串之間的相互轉換
- 打印語句
- 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
會返回一個包含空字符串的數組 ['']
。