การจัดการกับขีดเส้นใต้ชั้นนำในวิธีการเรียน PHP คืออะไร?


155

ในขณะที่ดูห้องสมุด PHP ต่างๆฉันพบว่าผู้คนจำนวนมากเลือกที่จะนำหน้าวิธีการเรียนด้วยการขีดเส้นใต้เดียวเช่น

public function _foo()

...แทน...

public function foo()

ฉันรู้ว่าในที่สุดสิ่งนี้ก็เกิดขึ้นตามความชอบส่วนตัว แต่ฉันก็สงสัยว่าถ้าใครมีความเข้าใจอย่างลึกซึ้งว่านิสัยนี้มาจากไหน

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

ความคิดข้อมูลเชิงลึกและ / หรือความคิดเห็นใด ๆ ที่จะได้รับการชื่นชม


9
อัปเดต 2014: มันเป็นไวยากรณ์ที่ล้าสมัยอย่างเป็นทางการ: github.com/php-fig/fig-standards/blob/master/accepted/ …
Sliq

คำตอบ:


155

มันมาจากยุคเก่าที่เลวร้ายของ Object Oriented PHP (PHP 4) การดำเนินการของ OO นั้นค่อนข้างแย่และไม่ได้รวมสิ่งต่าง ๆ เช่นวิธีการส่วนตัว เพื่อชดเชยนักพัฒนา PHP จะใช้วิธีการล่วงหน้าซึ่งเป็นแบบส่วนตัวโดยมีการขีดเส้นใต้ ในบางคลาสที่เก่ากว่าคุณจะเห็น/**private*/ __foo() {น้ำหนักที่เพิ่มขึ้นบ้าง

ฉันไม่เคยได้ยินนักพัฒนานำหน้าวิธีการทั้งหมดด้วยขีดล่างดังนั้นฉันจึงไม่สามารถเริ่มอธิบายสาเหตุที่


12
ฉันใส่เครื่องหมายขีดล่างก่อนเมธอดในตัวควบคุมที่เป็นไพรเวตของคลาสและไม่ได้ใช้ในการเราต์ เนื่องจากฉันทำงานกับกรอบงานของตัวเองสิ่งนี้เพิ่มความปลอดภัยเมื่อฉันบังคับใช้นโยบายที่ไม่มีขีดเส้นใต้นำบนชื่อตัวควบคุมภายในเส้นทาง แต่นี่ไม่ค่อยเกิน 1-2 วิธีต่อตัวควบคุม
Robert K

6
โดยการประชุมกับ Perl วิธีการเริ่มต้นด้วยขีดล่างเป็นส่วนตัว แต่มันเป็นเพียงแค่การประชุม ในความเป็นจริงวิธีการเหล่านี้ยังคงสามารถเข้าถึงได้จากนอกห้องเรียน
Luc M

ขีดเส้นใต้ทำให้รู้สึกยิ่งน้อยลงถ้าชั้นที่ขยายตัดสินใจที่จะทำให้วิธีการป้องกันของผู้ปกครองเป็นสาธารณะ มันเป็นกรณีขอบ แต่มันเกิดขึ้น นักพัฒนา API อาจเลือกที่จะเปิดเผยวิธีส่วนตัวในที่สาธารณะซึ่งหมายความว่าพวกเขาจะต้องปรับเปลี่ยนชื่อวิธีการเพิ่มเติมจากการเปลี่ยนตัวแก้ไขการเข้าถึง ไม่มีเรื่องใหญ่โต แต่เป็นเรื่องน่ารำคาญ
Johan Fredrik Varen

โจฮาน - การรื้อฟื้นเป็นเรื่องน่ารำคาญ? เครื่องมือแก้ไขของฉันมีคุณสมบัติชื่อ "ค้นหาและแทนที่" ใช้งานได้ดี!
DaveWalley

มันคือการประชุม C # ที่คุณสามารถใช้เพื่อนำหน้าสมาชิกส่วนตัวด้วยขีดเส้นใต้หนึ่งอัน ดังนั้นจึงเป็นการประชุม Zend Framework 1 (2012) ที่จะทำแบบเดียวกัน
alpham8 8

73

ฉันเชื่อว่าแหล่งข้อมูลที่น่าเชื่อถือที่สุดสำหรับการประชุมประเภทนี้สำหรับ PHP ในตอนนี้น่าจะเป็นPSR-2: C Style Style Guideเพราะ Zend Framework เป็นส่วนหนึ่งของPSR :

ชื่อคุณสมบัติไม่ควรขึ้นต้นด้วยเครื่องหมายขีดล่างเดียวเพื่อระบุการป้องกันหรือการเปิดเผยข้อมูลส่วนตัว


9
ฉันคิดว่าการใช้แบบแผนการตั้งชื่อไม่ใช่เหตุผลที่จะรักภาษา
sepehr

4
เมื่อฉันแรกอ่านเกี่ยวกับเรื่องนี้ฉันเข้าใจเหตุผลที่จะเป็นเพื่อให้คุณสามารถดูวิธีการและรู้ว่ามันเป็นของรัฐหรือเอกชน ซึ่งน่าจะสมเหตุสมผลมากกว่าถ้ามันเป็นข้อกำหนดมากกว่าการประชุม เพราะถ้าโปรแกรมเมอร์ 1 คนในทีมเพิ่มขีดล่างที่ไม่จำเป็นหรือทำให้เป็นสาธารณะด้วยการขีดเส้นใต้คุณจึงต้องสับสนอย่างมาก ตามที่ปรากฏออกมาสิ่งนี้มาจาก PHP4 ขณะที่ Jeremy ชี้ให้เห็นว่า & #ZF ใช้การประชุมนอก PEAR PEAR ได้ลบออกแล้ว & ฉันเชื่อว่า #ZF จะปฏิบัติตาม
joedevon

คำตอบนี้ถูกต้อง มันอยู่ทั่วสถานที่แช่งใน Magento และตามที่ระบุไว้โดย Sliq ด้านล่างมันเป็นแบบแผนที่ได้รับการคัดค้านโดยทั่วไป
siliconrockstar

นี่คือลิงค์อัพเดทเกี่ยวกับเรื่องนี้ framework.zend.com/manual/1.12/en/…
Shapeshifter

FYI (และ @joedevon) Zend 2.4 ได้รับการปล่อยตัวไม่กี่เดือนหลังและพวกเขายังคงใช้ขีดส่วนตัวและการป้องกันframework.zend.com/manual/current/en/ref/...
James

40

ตอนนี้ในปี 2013 นี่เป็นรูปแบบที่ไม่ดีอย่างเป็นทางการโดยแนวทางการเข้ารหัส PSR-2:

ชื่อคุณสมบัติไม่ควรขึ้นต้นด้วยเครื่องหมายขีดล่างเดียวเพื่อระบุการป้องกันหรือการเปิดเผยข้อมูลส่วนตัว `

ที่มา: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md


6
ตามPSR-2-> "ไม่ควร" หมายถึง "ไม่แนะนำ" ไม่ห้ามหมายความว่าในบางกรณีอาจยอมรับได้ เอกสาร PSR -> ietf.org/rfc/rfc2119.txt
ahmed hamdy

14

ฉันไม่เห็นด้วยอย่างยิ่งกับการเติมคำนำหน้าวิธีการส่วนตัว / การป้องกันด้วยการขีดล่างเนื่องจากคุณสามารถใช้คำหลักส่วนตัว / ได้รับการป้องกันสำหรับสิ่งนั้นและ IDE จะทำเครื่องหมายให้คุณ

และฉันก็ยังเป็นอยู่ แต่ฉันพบเหตุผลหนึ่งว่าทำไมมันถึงเป็นการฝึกฝนที่ดี ลองจินตนาการว่าคุณมีวิธีการของประชาชนaddFoo()และภายในวิธีการที่คุณมีบางส่วนของงานซึ่งเป็นเรื่องธรรมดาที่มีวิธีการอื่น ๆaddFooWhenBar(), addFooWhenBaz()... ตอนนี้ชื่อที่ดีที่สุดสำหรับการที่วิธีการที่พบจะเป็นaddFoo()แต่มันก็เป็นไปแล้วดังนั้นคุณจะต้องมากับบาง ชื่อที่น่าเกลียดเช่นaddFooInternal()หรือaddFooCommon()หรือ ... แต่_addFoo()วิธีส่วนตัวดูดีที่สุด


ใช่เห็นด้วย ที่จริงฉันมาที่นี่เพื่อดูว่าคนอื่นคิดอย่างไรกับการขีดเส้นใต้เพราะฉันไม่ค่อยได้ใช้มันและมักจะรู้สึกผิด แต่ตัวอย่างนี้เป็นครั้งเดียวที่ฉันมี ฉันยังใช้พวกเขาสำหรับบางกรณีของรูปแบบวิธีการแม่แบบที่วิธีการสาธารณะเรียกร้องให้ใช้วิธีการป้องกันเชิงนามธรรมที่เด็ก ๆ ได้เขียนทับซึ่งเป็นแนวคิดที่คล้ายกัน บางครั้งวิธีสาธารณะและวิธีการที่มีการป้องกันแบบนามธรรมที่เรียกว่าคล้ายกันหรือเกี่ยวข้องที่ตั้งชื่อพวกเขาแตกต่างกันดูเหมือนว่าแปลกกว่าเพียงแค่นำหน้า _ ไปยังนามธรรม
John Pancoast

12

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


10

ฉันใช้เครื่องหมายขีดเส้นใต้ในคลาส PHP 5 ที่ฉันเขียนสำหรับวิธีส่วนตัว มันเป็นคิวภาพเล็กน้อยสำหรับนักพัฒนาที่สมาชิกชั้นหนึ่งนั้นเป็นส่วนตัว การบอกใบ้ประเภทนี้ไม่เป็นประโยชน์เมื่อใช้ IDE ที่แยกแยะสมาชิกสาธารณะและส่วนตัวให้คุณ ฉันหยิบมันขึ้นมาจาก C # วันของฉัน นิสัยเก่า ...


5

ฉันเชื่อว่าข้อสันนิษฐานเดิมของคุณนั้นถูกต้องฉันพบว่ามันเป็นเรื่องธรรมดาสำหรับบางภาษาเพื่อนำหน้าขีดเส้นใต้ไปยังเมธอด / สมาชิก ฯลฯ ซึ่งมีไว้เพื่อเก็บเป็นส่วนตัวกับ "วัตถุ" เป็นวิธีที่แสดงภาพได้แม้ว่าคุณจะทำได้ แต่คุณไม่ควรเรียกสิ่งนี้!


5

ฉันกำลังมองหาคำตอบเดียวกันฉันได้ทำวิจัยและฉันเพิ่งค้นพบว่ากรอบ php แนะนำสไตล์ที่แตกต่าง

Code Igniter

คู่มืออย่างเป็นทางการมีส่วนรูปแบบการเข้ารหัสที่ส่งเสริมการปฏิบัตินี้ :

วิธีการและตัวแปรส่วนตัว

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

public function convert_text()

private function _convert_text()

กรอบอื่น ๆ ทำเช่นเดียวกันเช่น

CakePHP:

ทำเช่นเดียวกัน :

ทัศนวิสัยของสมาชิก

ใช้คำหลักส่วนตัวและได้รับการป้องกันของ PHP5 สำหรับวิธีและตัวแปร นอกจากนี้วิธีการที่ไม่ใช่แบบสาธารณะหรือชื่อตัวแปรเริ่มต้นด้วยเครื่องหมายขีดล่างเดียว (_) ตัวอย่าง:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

และนอกจากนี้ยังมี

ลูกแพร์

ทำเช่นเดียวกัน :

สมาชิกคลาสส่วนตัวนำหน้าด้วยเครื่องหมายขีดล่างเดี่ยว ตัวอย่างเช่น:

$_status    _sort()     _initTree()

ในขณะที่

Drupal

รูปแบบรหัสเตือนโดยเฉพาะกับสิ่งนี้ :

  1. คุณสมบัติและวิธีการป้องกันหรือส่วนตัวไม่ควรใช้คำนำหน้าขีดล่าง

ซิมโฟนี

ในทางกลับกันประกาศ :

Symfony ปฏิบัติตามมาตรฐานที่กำหนดในเอกสาร PSR-0, PSR-1, PSR-2 และ PSR-4


คำตอบอย่างละเอียดมาก
colonelclick

4

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

ฉันไม่รู้ว่านี่ยังคงเป็นแบบแผนที่จะใช้ในไพ ธ อนหรือไม่


3

ใน Drupal (php CMS) สามารถใช้ขีดล่างเพื่อป้องกันการเรียกใช้ hooks ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 )

ถ้าฉันมีโมดูลชื่อ "my_module" และต้องการตั้งชื่อฟังก์ชั่น my_module_insert มันจะ "hook" ในฟังก์ชั่น hook_insert เพื่อป้องกันไม่ให้ฉันสามารถเปลี่ยนชื่อฟังก์ชั่นของฉันเป็น _my_module_insert

ป.ล. วิธี hooks ทำงานใน Drupal เป็นไปได้ที่จะใช้เบ็ดโดยไม่ได้ตั้งใจซึ่งไม่ดีมาก


1
ฉันถือว่ามันเป็นข้อบกพร่องในการออกแบบของ drupal มาระยะหนึ่งแล้ว มันจะสมเหตุสมผลกว่าที่จะลงทะเบียน hooks ของคุณอย่างชัดเจนเพื่อป้องกันความสับสนและการทำงานที่ผิดปกติ โดยทั่วไปถือว่าเป็นสิ่งที่ไม่ดีและการสร้างที่รบกวนการเขียนโปรแกรมปกติหรือจี้พวกเขามักจะสถาปัตยกรรมที่ไม่ดี
mopsyd

3

Drupal และใช้เครื่องหมายขีดล่าง:

ในทางทั่วไปขีดเส้นใต้คือการทำเครื่องหมายความจริงง่ายๆว่าฟังก์ชั่นอาจจะถูกเรียกโดยฟังก์ชั่นหลักที่เกี่ยวข้องเท่านั้น ...

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

แน่นอนเป็นเพียงตัวอย่างง่ายๆ ...


0

ใช้ขีดล่างเพื่อจุดประสงค์ในการจดจำว่าเราจะไม่ 'แก้ไขตัวแปร' / 'เรียกใช้ฟังก์ชัน' นอกคลาส

ในขณะที่เราประกาศตัวแปร const ในตัวพิมพ์ใหญ่ทั้งหมดเพื่อให้ในขณะที่เห็นชื่อของตัวแปรสามารถเดาได้ว่ามันเป็นตัวแปร const เช่นเดียวกับตัวแปรที่เราไม่ต้องการแก้ไขนอกคลาสเราประกาศด้วยเครื่องหมายขีดล่างสำหรับการประชุมของเราเอง


คุณหมายถึงอะไรโดย "ตัวแปร const" วิธีที่คุณสามารถกำหนดค่าคงที่เป็นตัวแปรหรือไม่?
Nico Haase

-21

พวกเขาจะเรียกว่า"วิธีวิเศษ"


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