การมองเห็นเริ่มต้นของคลาสเมธอดใน PHP


118

ฉันดูคู่มือแต่ดูเหมือนจะหาคำตอบไม่ได้

การมองเห็นเริ่มต้นใน PHP สำหรับวิธีการที่ไม่มีการประกาศการเปิดเผยคืออะไร? PHP มีการมองเห็นแพ็คเกจเหมือนใน Java หรือไม่?

ตัวอย่างเช่นในรหัสต่อไปนี้เป็นgo()สาธารณะหรือส่วนตัว?

class test {
  function go() {
  }
}

เหตุผลที่ผมถามคือว่าผมเคยเห็นรหัสก่อสร้างงานเขียนเป็นจำนวนมากและบางส่วนเป็นfunction __construct() public function __construct()เทียบเท่าหรือไม่?

คำตอบ:


179

ค่าเริ่มต้นคือสาธารณะ

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

http://www.php.net/manual/en/language.oop5.visibility.php


11
เช่นเดียวกับคุณสมบัติ
Marc 237

7
เช่นเดียวกันสำหรับค่าคงที่
Kolyunya

22

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

และไม่ PHP ไม่มีการมองเห็นแพ็คเกจส่วนใหญ่เป็นเพราะจนกระทั่งเมื่อไม่นานมานี้ PHP ไม่มีแพ็คเกจ


16
@Ian: ฉันจะพูดเพราะ "ชัดเจนดีกว่านัย" (ตามที่Zen of pythonกล่าว) มันทำให้โปรแกรมเมอร์คนอื่นเสียวงจรสมองที่สงสัยว่าตัวสร้างเป็นแบบส่วนตัวหรือสาธารณะหรืออะไร หากผู้คนใช้ตัวแก้ไขการเข้าถึงเสมอผู้โพสต์ต้นฉบับอาจไม่ได้ถามคำถามนี้
ผู้ใช้

นอกจากนี้ในภาษาต่างๆเช่น Java ค่าดีฟอลต์คือ package-private คนหนึ่งมักจะสงสัยว่าแพ็กเกจเป็นแบบส่วนตัวโดยการออกแบบหรือผู้พัฒนาลืมระบุ (โดยเฉพาะเมื่อต้องติดต่อกับนักพัฒนาที่ไม่อาวุโส) นั่นเป็นเหตุผลที่ PMD รวมกฎเช่นนี้: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco

9

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


ความรุ่งโรจน์สำหรับการให้เหตุผล
Guney Ozsan


1

เมื่อไม่มีการมองเห็นคำหลัก ( public, privateหรือprotected) ที่ใช้วิธีการจะเป็นที่สาธารณะ แต่คุณไม่สามารถกำหนดคุณสมบัติด้วยวิธีนี้ สำหรับคุณสมบัติคุณจะต้องต่อท้ายคีย์เวิร์ดการเปิดเผยในการประกาศ

สำหรับคุณสมบัติที่ไม่ได้ประกาศในคลาสและคุณกำหนดค่าให้กับมันภายในเมธอดจะมีการเปิดเผยต่อสาธารณะ

<?php
class Example {
    public $name; 
    public function __construct() {
        $this -> age = 9; // age is now public
        $this -> privateFunction();
    }
    private function privateFunction() {
        $this -> country = "USA"; // this is also public
    }
}

0

function __construct()และpublic function __construct()ทำงานเป็นชื่อวิธีการเดียวกัน

หากคุณไม่สามารถกำหนดคำนำหน้าสำหรับชื่อเมธอดได้ควรเป็นค่าเริ่มต้นสาธารณะ

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