echo, print และ print_r ใน PHP แตกต่างกันอย่างไร?


197

ผมใช้echoและมากและแทบจะไม่เคยใช้print_rprint

ผมรู้สึกechoเป็นแมโครและเป็นนามแฝงของprint_rvar_dump

แต่นั่นไม่ใช่วิธีมาตรฐานในการอธิบายความแตกต่าง


3
print_r ไม่ได้เป็นนามแฝงของ var_dump อย่างแน่นอน - มันส่งออกในรูปแบบที่แตกต่างกัน ยวดเอาท์พุทจาก var_dump ยังรวมถึง "ประเภท" ของแต่ละตัวแปร
thomasrutter


รายละเอียดเพิ่มเติมที่จะเพิ่มและอาจมีประโยชน์คือ var_dump ตัดข้อความที่ยาวมากแสดง ... และระบุความยาวที่เหลือตัวอย่างเช่น: แม้ '... (length = 4482) หากคุณใช้ echo สิ่งนี้จะไม่เกิดขึ้น
Yordan

คำตอบ:


186

printและechoจะมากหรือน้อยเหมือนกัน; พวกเขาทั้งสองภาษาสร้างที่แสดงสตริง ความแตกต่างคือบอบบาง: printมีค่าตอบแทน 1 ดังนั้นจึงสามารถใช้ในการแสดงออกในขณะที่echoมีvoidประเภทผลตอบแทน echoสามารถใช้พารามิเตอร์หลายตัวได้แม้ว่าการใช้งานจะหายาก จะเร็วกว่าเล็กน้อยecho print(โดยส่วนตัวแล้วฉันมักจะใช้echoไม่เคยprint)

var_dumpพิมพ์ดัมพ์รายละเอียดของตัวแปรรวมถึงชนิดและชนิดของรายการย่อยใด ๆ (ถ้าเป็นอาร์เรย์หรือวัตถุ) print_rพิมพ์ตัวแปรในรูปแบบที่มนุษย์อ่านได้มากขึ้น: ไม่มีการอ้างถึงสตริง, ไม่พิมพ์ข้อมูล, ขนาดอาร์เรย์ไม่ได้รับ, เป็นต้น

var_dumpโดยปกติแล้วจะมีประโยชน์มากกว่าprint_rเมื่อทำการดีบั๊กในประสบการณ์ของฉัน มันมีประโยชน์อย่างยิ่งเมื่อคุณไม่รู้ค่า / ประเภทที่คุณมีในตัวแปร พิจารณาโปรแกรมทดสอบนี้:

$values = array(0, 0.0, false, '');

var_dump($values);
print_r ($values);

ด้วยprint_rคุณไม่สามารถบอกความแตกต่างระหว่าง0และ0.0หรือfalseและ'':

array(4) {
  [0]=>
  int(0)
  [1]=>
  float(0)
  [2]=>
  bool(false)
  [3]=>
  string(0) ""
}

Array
(
    [0] => 0
    [1] => 0
    [2] => 
    [3] => 
)

1
โครงสร้างทางภาษาคืออะไร?
omg

1
@Shore - เป็นสิ่งที่สร้างขึ้นในภาษาที่ไม่ใช่ฟังก์ชั่น โดยทั่วไปแล้วจะเร็วมากและไม่ทำงานเหมือนกับฟังก์ชั่นปกติ
alex

3
แก้ไขสองปีต่อมาเพื่อแก้ไขความไม่ถูกต้องที่ระบุในความคิดเห็นเหล่านี้ ขอบคุณทุกคนฉันต้องนอนในวันที่ 7 มิถุนายน '10 ;-)
John Kugelman


5
ด่วนไปยังมือถือทนายความ!
John Kugelman

100

เสียงสะท้อน

  • เอาต์พุตหนึ่งสตริงหรือมากกว่านั้นคั่นด้วยเครื่องหมายจุลภาค
  • ไม่มีค่าตอบแทน

    เช่น echo "String 1", "String 2"

พิมพ์

  • ส่งออกเพียงสายเดียว
  • ส่งคืน1ดังนั้นจึงสามารถใช้ในการแสดงออก

    เช่น print "Hello"

    หรือ, if ($expr && print "foo")

print_r ()

  • ส่งออกการเป็นตัวแทนที่มนุษย์สามารถอ่านได้ของค่าใดค่าหนึ่ง
  • ยอมรับไม่เพียง แต่สตริง แต่เป็นประเภทอื่นรวมถึงอาร์เรย์และวัตถุการจัดรูปแบบให้อ่านได้
  • มีประโยชน์เมื่อทำการดีบั๊ก
  • อาจส่งคืนเอาต์พุตเป็นค่าส่งคืน (แทนที่จะเป็นเสียงสะท้อน) หากได้รับอาร์กิวเมนต์ที่เป็นทางเลือกที่สอง

var_dump ()

  • ส่งออกการแสดงที่มนุษย์สามารถอ่านได้ซึ่งมีหนึ่งค่าขึ้นไปคั่นด้วยเครื่องหมายจุลภาค
  • ยอมรับไม่เพียง แต่สตริง แต่เป็นประเภทอื่นรวมถึงอาร์เรย์และวัตถุการจัดรูปแบบให้อ่านได้
  • ใช้รูปแบบเอาต์พุตprint_r()อื่นเพื่อยกตัวอย่างเช่นมันยังพิมพ์ประเภทของค่า
  • มีประโยชน์เมื่อทำการดีบั๊ก
  • ไม่มีค่าตอบแทน

var_export ()

  • ส่งออกการเป็นตัวแทนของมนุษย์ที่สามารถอ่านได้และ PHP ที่ปฏิบัติการได้ของค่าใดค่าหนึ่ง
  • ยอมรับไม่เพียง แต่สตริง แต่เป็นประเภทอื่นรวมถึงอาร์เรย์และวัตถุการจัดรูปแบบให้อ่านได้
  • ใช้รูปแบบเอาต์พุตที่แตกต่างกันไปทั้งคู่print_r()และvar_dump()- ผลลัพธ์ที่ได้คือโค้ด PHP ที่ถูกต้อง!
  • มีประโยชน์เมื่อทำการดีบั๊ก
  • อาจส่งคืนเอาต์พุตเป็นค่าส่งคืน (แทนที่จะเป็นเสียงสะท้อน) หากได้รับอาร์กิวเมนต์ที่เป็นทางเลือกที่สอง

หมายเหตุ:

  • แม้ว่าprintสามารถใช้ในนิพจน์ได้ แต่ฉันแนะนำให้คนหลีกเลี่ยงการทำเช่นนั้นเพราะมันไม่ดีต่อการอ่านโค้ด (และเพราะมันไม่น่าจะมีประโยชน์เลย) กฎที่มีลำดับความสำคัญเมื่อมีการโต้ตอบกับตัวดำเนินการอื่นอาจทำให้สับสนได้เช่นกัน echoด้วยเหตุนี้ผมเองไม่เคยมีเหตุผลที่จะใช้มันมากกว่า
  • ในขณะที่echoและprintเป็นภาษาสร้างprint_r()และvar_dump()/ var_export()เป็นฟังก์ชั่นปกติ คุณไม่จำเป็นต้องใช้วงเล็บในการใส่อาร์กิวเมนต์ให้กับechoหรือprint(และถ้าคุณใช้มันมันจะถูกใช้เหมือนในนิพจน์)
  • ในขณะที่var_export()ผลตอบแทน PHP eval()รหัสที่ถูกต้องช่วยให้ค่าที่จะอ่านกลับมาอาศัยนี้รหัสการผลิตอาจจะทำให้มันง่ายที่จะแนะนำช่องโหว่ความปลอดภัยเนื่องจากความต้องการในการใช้งาน จะเป็นการดีกว่าถ้าใช้รูปแบบเช่น JSON แทนเพื่อจัดเก็บและอ่านค่ากลับ ความเร็วจะเทียบเคียง

3
เพียงแค่บันทึกย่อเกี่ยวกับเมื่อคุณต้องการecho $a, $b;ไวยากรณ์เมื่อคุณสามารถทำได้echo $a . $b;: ถ้า $ a หรือ $ b เป็นสตริงที่มีขนาดใหญ่จริงๆแล้วหลังจะใช้หน่วยความจำเพิ่มเติมและเวลาในการสร้างรุ่นที่ต่อกันของสตริงในหน่วยความจำก่อน สามารถเริ่มการส่งออกไปยังเบราว์เซอร์
thomasrutter

แน่นอนคุณสามารถใช้echo $a; echo $b;เช่นกัน
thomasrutter

16

เพียงเพื่อเพิ่มคำตอบของจอห์น , echoควรจะเป็นเพียงคนเดียวที่คุณใช้ในการพิมพ์เนื้อหาไปยังหน้า

printช้ากว่าเล็กน้อย var_dump()และprint_r()ควรใช้เพื่อแก้ไขข้อบกพร่องเท่านั้น

นอกจากนี้ยังมีมูลค่าการกล่าวขวัญว่าprint_r()และvar_dump()จะสะท้อนโดยค่าเริ่มต้นเพิ่มอาร์กิวเมนต์ที่สองไปอย่างน้อยที่ประเมินเป็นจริงจะได้รับมันจะกลับมาแทนเช่นprint_r()print_r($array, TRUE)

ความแตกต่างระหว่างการสะท้อนและการย้อนกลับคือ:

  • echo: จะพิมพ์ค่าไปยังเอาต์พุตทันที
  • return: จะคืนค่าเอาต์พุตของฟังก์ชันเป็นสตริง มีประโยชน์สำหรับการบันทึก ฯลฯ

เพียงเพราะคุณแยกแยะปัญหาที่เกิดขึ้นความแตกต่างระหว่างechoไอเอ็นจีและreturnไอเอ็นจีคืออะไร?
30932 David บอกว่าคืนสถานะโมนิกา

2
ว้าวฉันหวังว่าฉันรู้เกี่ยวกับพารามิเตอร์ที่ส่งคืน :( โดยทั่วไปคุณสามารถทำ $ foo = print_r ($ array, true) และใช้ในวิธีอื่น ๆ (เป็นบันทึกตาราง ฯลฯ )
FryGuy

ฉันใช้print_rParam ที่กลับมาค่อนข้างมากในขณะที่ฉันเขียนโค้ด PHP print_r( $foo, 1 );แต่ผมมักจะเขียน มันเร็วกว่าในการพิมพ์;) และเกี่ยวกับเรื่องนี้ฉันไม่สนใจเรื่องการอ่านมากนักเนื่องจากฉันพบว่าชื่อprint_rไม่ได้อธิบายอะไรมากนัก
exhuma

var_dump()ไม่รองรับอาร์กิวเมนต์ที่สองที่อนุญาตให้ส่งคืนค่าเช่นprint_r()นี้เนื่องจากvar_dump()สามารถยอมรับอาร์กิวเมนต์หลายตัวเพื่อแสดงผล
thomasrutter

@thomasrutter True ไม่แน่ใจว่าทำไมฉันถึงเขียนมัน
alex

6
echo

ไม่มีประเภทส่งคืน

print

มีประเภทผลตอบแทน

print_r()

เอาท์พุทเป็นรูปแบบ


5

ความแตกต่างระหว่างecho , print , print_rและvar_dumpนั้นง่ายมาก

เสียงสะท้อน

echoไม่ใช่ฟังก์ชั่น แต่เป็นภาษาสร้างที่ใช้พิมพ์เอาต์พุต มันเร็วกว่าการพิมพ์เล็กน้อย

echo "Hello World";    // this will print Hello World
echo "Hello ","World"; // Multiple arguments - this will print Hello World

$var_1=55;
echo "$var_1";               // this will print 55
echo "var_1=".$var_1;        // this will print var_1=55
echo 45+$var_1;              // this will print 100

$var_2="PHP";
echo "$var_2";                   // this will print PHP

$var_3=array(99,98,97)           // Arrays are not possible with echo (loop or index  value required)
$var_4=array("P"=>"3","J"=>"4"); // Arrays are not possible with echo (loop or index  value required)

คุณยังสามารถใช้คำสั่ง echo ด้วยหรือไม่ใช้ parenthese

echo ("Hello World");   // this will print Hello World

พิมพ์

เช่นเดียวกับecho construct printการสร้างภาษาก็ไม่ใช่ฟังก์ชั่นที่แท้จริง ความแตกต่างระหว่างเสียงสะท้อน และการพิมพ์คือการ พิมพ์ ยอมรับการโต้แย้งเพียงครั้งเดียวและการพิมพ์กลับเสมอ 1 ในขณะที่เสียงสะท้อนไม่มีค่าตอบแทน ดังนั้นคำสั่งการพิมพ์สามารถใช้ในการแสดงออก

print "Hello World";    // this will print Hello World
print "Hello ","World"; // Multiple arguments - NOT POSSIBLE with print
$var_1=55;
print "$var_1";               // this will print 55
print "var_1=".$var_1;        // this will print var_1=55
print 45+$var_1;              // this will print 100

$var_2="PHP";
print "$var_2";                   // this will print PHP

$var_3=array(99,98,97)           // Arrays are not possible with print (loop or index  value required)
$var_4=array("P"=>"3","J"=>"4"); // Arrays are not possible with print (loop or index  value required)

เช่นเดียวกับก้อง , การพิมพ์ สามารถนำมาใช้โดยมีหรือไม่มีวงเล็บ

print ("Hello World");   // this will print Hello World

print_r

ฟังก์ชันprint_r ()ใช้เพื่อพิมพ์ข้อมูลที่มนุษย์สามารถอ่านได้เกี่ยวกับตัวแปร หากอาร์กิวเมนต์เป็นอาร์เรย์ฟังก์ชันprint_r ()จะพิมพ์คีย์และองค์ประกอบ (เหมือนกันกับวัตถุ)

print_r ("Hello World");    // this will print Hello World

$var_1=55;
print_r ("$var_1");               // this will print 55
print_r ("var_1=".$var_1);        // this will print var_1=55
print_r (45+$var_1);              // this will print 100

$var_2="PHP";
print_r ("$var_2");                // this will print PHP

$var_3=array(99,98,97)             // this will print Array ( [0] => 1 [1] => 2 [2] => 3 ) 
$var_4=array("P"=>"3","J"=>"4");   // this will print  Array ( [P] => 3 [J] => 4 ) 

var_dump

ฟังก์ชันvar_dumpมักใช้สำหรับการดีบั๊กและพิมพ์ข้อมูล (ประเภทและค่า) เกี่ยวกับตัวแปร / อาร์เรย์ / วัตถุ

var_dump($var_1);     // this will print  int(5444) 
var_dump($var_2);     // this will print  string(5) "Hello" 
var_dump($var_3);     // this will print  array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
var_dump($var_4);     // this will print  array(2) { ["P"]=> string(1) "3" ["J"]=> string(1) "4" }

3

เสียงสะท้อน :

มันเป็นคำสั่งไม่ใช่ฟังก์ชั่นไม่มีค่าตอบแทน

ไม่จำเป็นต้องใส่วงเล็บ

ไม่ได้พิมพ์ Array

พิมพ์

มันเป็นฟังก์ชั่นจริง

ส่งคืนชนิด 1

จำเป็นต้องใช้วงเล็บ

ไม่ได้พิมพ์ Array

print_r

พิมพ์ในรูปแบบที่มนุษย์อ่านได้

สตริงไม่อยู่ในเครื่องหมายคำพูด

ข้อมูลรายละเอียดของตัวแปรไม่เหมือนประเภทและทั้งหมด

var_dump

ข้อมูลดัมพ์ทั้งหมดของตัวแปรเช่นชนิดขององค์ประกอบและอิลิเมนต์ย่อย


2
มีปัญหามากมายกับคำตอบนี้ printจะไม่ได้ฟังก์ชั่นที่แท้จริงมันเป็นภาษาสร้างเช่นเดียวกับก้อง มันยังสามารถใช้เป็นคำสั่ง echoคือไม่ได้คำสั่งหรือมันสามารถนำมาใช้ใน printไม่ไม่จำเป็นต้องมีวงเล็บหรือไม่ก้องอย่างใดอย่างหนึ่งหรือพิมพ์ใช้วงเล็บเช่นฟังก์ชั่นจะ นอกจากนี้คุณยังพลาดหนึ่งในความแตกต่างหลัก - echo ยอมรับหลาย ๆ สายเพื่อ echo คั่นด้วยเครื่องหมายจุลภาค
thomasrutter

2
... และคุณส่งคำตอบนี้เมื่อมีคำตอบหลายคำตอบอยู่แล้วและมีข้อมูลที่ถูกต้อง
thomasrutter

2

** Echocan ยอมรับหลายนิพจน์ในขณะที่พิมพ์ไม่ได้ ฟังก์ชัน Print_r () PHP ใช้เพื่อส่งกลับอาร์เรย์ในรูปแบบที่มนุษย์อ่านได้ มันเขียนง่าย ๆ ว่า

![Print_r ($your_array)][1]

2

echo: echo เป็นโครงสร้างภาษาที่ไม่จำเป็นต้องใช้วงเล็บกับมันและมันสามารถใช้พารามิเตอร์จำนวนใด ๆ และกลับเป็นโมฆะ

   void echo (param1,param2,param3.....);

   Example: echo "test1","test2,test3";

พิมพ์: มันเป็นโครงสร้างภาษาที่ไม่จำเป็นต้องใช้วงเล็บมันใช้เวลาเพียงหนึ่งพารามิเตอร์และกลับมา

    1 always.

           int print(param1);

           print "test1";
           print "test1","test2"; // It will give syntax error

prinf: เป็นฟังก์ชันที่ใช้อย่างน้อยหนึ่งสตริงและรูปแบบของรูปแบบและส่งคืนความยาวของเอาต์พุตสตริง

    int printf($string,$s);

    $s= "Shailesh";
    $i= printf("Hello %s how are you?",$s);    
    echo $i;

    Output : Hello Shailesh how are you?
             27



   echo returns void so its execution is faster than print and printf


0

print_r () สามารถพิมพ์ค่าออกมาได้ แต่ถ้าพารามิเตอร์พารามิเตอร์ที่สองถูกส่งผ่านและเป็น TRUE - มันจะส่งกลับผลการพิมพ์เป็นสตริงและไม่มีอะไรส่งไปยังเอาต์พุตมาตรฐาน เกี่ยวกับ var_dump หาก XDebug debugger ได้รับการติดตั้งดังนั้นผลลัพธ์ของผลลัพธ์จะถูกจัดรูปแบบในรูปแบบที่อ่านและเข้าใจได้ง่ายขึ้น


-1

พวกเขาทั้งคู่เป็นโครงสร้างภาษา echo จะคืนค่าว่างเปล่าและการคืนค่าการพิมพ์ 1. echo นั้นถือว่าเร็วกว่าการพิมพ์เล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.