ข้อดีของการใช้ heredoc ใน PHP คืออะไร? [ปิด]


196

ข้อดีของการใช้heredocใน PHP คืออะไรและคุณสามารถแสดงตัวอย่างได้หรือไม่?


4
ไม่มีเหตุผลอื่นที่ดีกว่า heredocs
Shakti Singh เมื่อ

18
ฉันได้แก้ไขสิ่งนี้ให้มีความสร้างสรรค์มากขึ้นและทำให้ชุมชนคำถามเกิดขึ้นเพราะมันเป็นเรื่องส่วนตัว หมายเหตุชุมชนอาจยังคงปิดฉันเลือกที่จะปล่อยให้เปิดเพราะคุณได้รับคำตอบที่มีคุณภาพ
Tim Post

9
เหตุใดคำถามนี้จึงไม่ถือเป็นเชิงสร้างสรรค์
Ambo100

คำตอบ:


218

ไวยากรณ์ heredoc นั้นสะอาดกว่าสำหรับฉันมากและมันมีประโยชน์มากสำหรับสตริงหลายบรรทัดและหลีกเลี่ยงปัญหาการอ้างอิง ย้อนกลับไปในวันที่ฉันใช้เพื่อสร้างแบบสอบถาม SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

สำหรับฉันสิ่งนี้มีความเป็นไปได้น้อยกว่าที่จะแนะนำข้อผิดพลาดทางไวยากรณ์มากกว่าการใช้เครื่องหมายคำพูด:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

อีกจุดหนึ่งคือหลีกเลี่ยงการหลีกเลี่ยงอัญประกาศคู่ในสตริงของคุณ:

$x = "The point of the \"argument" was to illustrate the use of here documents";

pProblem ที่มีด้านบนเป็นข้อผิดพลาดทางไวยากรณ์ (คำพูดที่หายไปหลบหนี) ฉันเพิ่งนำมาใช้ซึ่งตรงข้ามกับที่นี่ไวยากรณ์ของเอกสาร:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

มันมีสไตล์นิดหน่อย แต่ฉันใช้สิ่งต่อไปนี้เป็นกฎสำหรับเอกสารเดี่ยวสองครั้งและที่นี่เพื่อกำหนดสตริง:

  • ใช้อัญประกาศเดี่ยวเมื่อสตริงเป็นค่าคงที่'no variables here'
  • เครื่องหมายคำพูดคู่เมื่อฉันสามารถวางสตริงบนบรรทัดเดียวและต้องการการแก้ไขตัวแปรหรือเครื่องหมายคำพูดเดี่ยวที่ฝัง"Today is ${user}'s birthday"
  • นี่คือเอกสารสำหรับสตริงหลายบรรทัดที่ต้องการการจัดรูปแบบและการแก้ไขตัวแปร

40
Nitpick ในตัวอย่าง SQL ของคุณ: คุณไม่ควรใช้เครื่องหมายคำพูดคู่ในนั้นในตอนแรก ใช้งานได้กับ MySQL เท่านั้นและเฉพาะเมื่อเซิร์ฟเวอร์นั้นไม่ทำงานใน--ansiโหมดที่เข้ากันได้ สตริง SQL ต้องใช้เครื่องหมายคำพูดเดี่ยว
มาริโอ

17
@mario มันเป็นภาพของปัญหาที่เกิดขึ้นกับการใช้คำพูดสองทั่วไปไม่ได้เกี่ยวกับรายละเอียดของ SQL ที่
เวสสตรีท

4
อย่าบอกว่าการวางตัวแปรลงในแบบสอบถามโดยตรงนั้นเป็นมารยาทที่ไม่ดีและไม่ดี :-P
สามัญสำนึกของคุณ

5
@Wes และ @mario นี่คือ ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths

11
"อย่าบอกว่าการวางตัวแปรลงในคิวรีโดยตรงนั้นเป็นมารยาทที่ไม่ดีและไม่ดี" นี่ไม่เป็นความจริงเลย การวางอินพุตที่ไม่ผ่านการตรวจสอบในคำสั่ง SQL คือ "มารยาทที่ไม่ดี" บางครั้งการวางตัวแปรภายในคำสั่ง SQL เป็นสิ่งจำเป็น
vogomatix

67

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

มากตัวอย่างที่พบ: สะท้อนออกมาจากภายใน HTML PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

ง่ายต่อการอ่านและบำรุงรักษาง่าย

อีกทางเลือกหนึ่งคือการสะท้อนสตริงที่ยกมาซึ่งจบลงด้วยคำพูดที่หลบหนีและ IDE จะไม่เน้นไวยากรณ์สำหรับภาษานั้นซึ่งนำไปสู่การอ่านไม่ดีและความยากลำบากในการบำรุงรักษามากขึ้น

อัปเดตคำตอบสำหรับสามัญสำนึกของคุณแล้ว

แน่นอนคุณไม่ต้องการเห็นข้อความค้นหา SQL ที่เน้นเป็น HTML หากต้องการใช้ภาษาอื่นเพียงเปลี่ยนภาษาในไวยากรณ์:

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
คุณรู้จักฟีเจอร์"การหลบหนีจาก PHP " ของPHPหรือไม่
สามัญสำนึกของคุณ

5
การหลบหนีจาก PHP นั้นทำได้ดีในบางครั้ง แต่เมื่อคุณสะท้อนสิ่งต่างๆออกมาการเน้นไวยากรณ์ของตัวแบ่งคุณจะต้องพิมพ์ตัวอักษรให้มากขึ้นโดยการหลบหนีอย่างง่ายจาก PHP และ PHP มีคำสั่งให้ทำงานแทนเสียงก้องเดียว นอกจากนี้คุณสามารถตั้งค่าสตริง Heredoc เป็นตัวแปรและสะท้อนในภายหลัง การหลบหนี PHP สำหรับ HTML ของคุณหมายความว่ามันถูกพิมพ์ออกมาแล้ว ไม่สามารถบันทึกได้ในภายหลัง
Jake Wilson

2
1. คุณสามารถใช้บัฟเฟอร์เอาต์พุตเพื่อบันทึกเอาต์พุต 2. คุณใช้เสียงสะท้อนในตัวอย่างแรกของคุณ 3. (ดี) IDE หรือเครื่องมือแก้ไขข้อความไม่ควรเน้น HTML เมื่อคุณใช้การหลบหนีจาก PHP 4. IDE เน้นไวยากรณ์แบบใดสำหรับ HEREDOC และกฎภาษาใดที่ใช้ ไม่เป็นไรหรือที่จะเห็นข้อความค้นหา SQL ที่เน้นเป็นข้อความ HTML
สามัญสำนึกของคุณ

1
Heredoc เป็นสตริง PHP แน่นอนคุณไม่สามารถใช้โครงสร้างการควบคุมในสตริงได้ php.net/manual/en/language.types.string.php
Jake Wilson

11
ฉันคิดว่าคุณเข้าใจผิดว่า Heredoc ใช้กับสตริง HTML เท่านั้น Heredoc's เป็นเพียงวิธีทางเลือกหนึ่งในการกำหนดสตริงไม่ว่าจะเป็น HTML หรือแบบสอบถาม SQL หรือสิ่งที่คุณต้องการ พวกเขาง่ายต่อการเขียนและดูแลรักษาคำตอบของ Wes ข้างต้นแสดงให้เห็นว่าค่อนข้างชัดเจน (ซึ่งหากคุณทราบว่ามีการเน้นไวยากรณ์ที่ถูกต้องอย่าบ่นกับฉันเกี่ยวกับ NetBeans ที่ล้มเหลว) ฉันไม่แน่ใจว่าทำไมคุณดูโค้งลงบนคำตอบสำหรับคำถาม wiki ชุมชน ... เชื่อหรือไม่นักพัฒนา PHP ดั้งเดิมอาจรวม Heredoc's ใน PHP เพราะมันอาจมีประโยชน์ในบางกรณี .. .
Jake Wilson

8

IDE บางตัวเน้นรหัสในสตริง heredoc โดยอัตโนมัติ - ซึ่งใช้ heredoc สำหรับ XML หรือ HTML ที่ดึงดูดสายตา

ฉันชอบมันสำหรับส่วนที่ยาวกว่าของเช่น XML เนื่องจากฉันไม่ต้องสนใจเรื่องการอ้างอิงตัวอักษรและสามารถวาง XML ได้


6

ก่อนอื่นเหตุผลทั้งหมดเป็นเรื่องส่วนตัว มันเป็นเรื่องของรสนิยมมากกว่าเหตุผล

ส่วนตัวฉันพบ heredoc ค่อนข้างไร้ประโยชน์และใช้เป็นบางครั้งส่วนใหญ่เวลาที่ฉันต้องได้รับ HTML เป็นตัวแปรและไม่ต้องการรำคาญกับการส่งออกบัฟเฟอร์ในรูปแบบข้อความอีเมล HTML เช่น

การจัดรูปแบบไม่สอดคล้องกับกฎการเยื้องทั่วไป แต่ฉันไม่คิดว่ามันเป็นเรื่องใหญ่

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

สำหรับตัวอย่างในคำตอบที่ยอมรับก็เป็นเพียงการโกง
อันที่จริงแล้วตัวอย่างของสตริงมีความรัดกุมถ้าไม่มีใครโกงพวกเขา

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';

3

ฉันไม่รู้ว่าฉันจะพูดว่า heredoc เป็นความขี้เกียจ เราสามารถพูดได้ว่าการทำสิ่งใดสิ่งหนึ่งคือความเกียจคร้านเนื่องจากมีวิธีที่ยุ่งยากมากกว่าในการทำสิ่งใด

ตัวอย่างเช่นในบางสถานการณ์คุณอาจต้องการส่งออกข้อความด้วยตัวแปรฝังตัวโดยไม่ต้องดึงข้อมูลจากไฟล์และเรียกใช้การแทนที่แม่แบบ Heredoc ช่วยให้คุณไม่ต้องออกจากคำพูดดังนั้นข้อความที่คุณเห็นคือข้อความที่คุณส่งออก เห็นได้ชัดว่ามีข้อเสียบางอย่างตัวอย่างเช่นคุณไม่สามารถเยื้อง heredoc ของคุณและนั่นอาจทำให้คุณหงุดหงิดในบางสถานการณ์

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