php ฟังก์ชันคงที่


108

ฉันมีคำถามเกี่ยวกับฟังก์ชันคงที่ใน php

สมมติว่าฉันมีคลาส

class test {
    public function sayHi() {
        echo 'hi';
    }
}

ถ้าฉันtest::sayHi();ใช้งานได้โดยไม่มีปัญหา

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); ทำงานได้เช่นกัน

อะไรคือความแตกต่างระหว่างชั้นหนึ่งและชั้นสอง?

มีอะไรพิเศษเกี่ยวกับฟังก์ชันคงที่?


15
ในขณะที่ php7 คุณไม่สามารถเรียกวิธีการแบบไม่คงที่แบบคงที่ได้
sanjay yadav

คำตอบ:


153

ในชั้นแรกsayHi()เป็นจริงวิธีการเช่นที่คุณจะเรียกเป็นวิธีการแบบคงที่และคุณจะได้รับไปกับมันเพราะไม่เคยหมายถึงsayHi()$this

ฟังก์ชันคงที่เกี่ยวข้องกับคลาสไม่ใช่อินสแตนซ์ของคลาส ด้วยเหตุ$thisนี้จึงไม่สามารถใช้ได้จากบริบทคงที่ ( $thisไม่ได้ชี้ไปที่วัตถุใด ๆ )


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

1
แล้วทำไมพวกเขาถึงบอกว่ามันเป็นฟังก์ชันคงที่? เนื่องจากไม่มีหลายอินสแตนซ์ที่มีการไหลของข้อมูลแบบไดนามิกและเอาต์พุตแบบไดนามิก เพียงแค่แนะนำฉัน @ ความวุ่นวาย
อาทิตย์

22

เพียงแค่ฟังก์ชั่นคงที่ทำงานโดยไม่ขึ้นกับคลาสที่พวกมันอยู่

$ หมายความว่านี่คือวัตถุของคลาสนี้ ไม่ใช้กับฟังก์ชันคงที่

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9
ตกลงฉันไม่ใช่ตัวช่วยสร้าง PHP แต่ไม่ใช่ตัวแปร ('สวัสดี') ที่ส่งผ่านไปยังฟังก์ชันคงที่ถูกเขียนทับด้วย 'Hi' อย่างชัดเจนหรือไม่? แปลว่าบรรทัดพิมพ์ test1 :: sayHi ('hello'); จะไม่กลับมา 'สวัสดี' แต่จะกลับมา 'สวัสดี'?
Fnord23

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

ไม่ใช่ตัวอย่างที่ดีมาก $ hi = 'สวัสดี'; เขียนทับอาร์กิวเมนต์ที่กำหนดและไม่มีส่วนเกี่ยวข้องกับการประกาศแบบคงที่ ฉันจะแก้ไขสิ่งนี้: self :: $ hi = $ hi; และมันจะทำงานเหมือนกับไม่คงที่ คุณสามารถเข้าถึงตัวแปรคลาสได้ด้วย self :: แทน $ this->
GotBatteries

20

ความแตกต่างทั้งหมดคือคุณไม่ได้รับ$thisภายในฟังก์ชันคงที่ หากคุณพยายามใช้$thisคุณจะได้รับไฟล์Fatal error: Using $this when not in object context.

โอเคข้อแตกต่างอย่างหนึ่ง: E_STRICTคำเตือนสร้างขึ้นจากตัวอย่างแรกของคุณ


1
ฉันไม่มีคำเตือนเมื่อฉันใช้ครั้งแรกและฉันอยู่ใน php7
ashkan nasirzadeh

ทำไมเราไม่มี $ นี้ในฟังก์ชันคงที่? ตรรกะทางสถาปัตยกรรมของสิ่งนี้คืออะไร? ขอบคุณ.
Lucas Bustamante

@LucasBustamante: $thisหมายถึงวัตถุปัจจุบัน ในฟังก์ชันคงที่ไม่มีวัตถุปัจจุบัน ฟังก์ชันมีอยู่ในคลาสโดยไม่จำเป็นต้องมีหรืออ้างอิงถึงอินสแตนซ์อ็อบเจ็กต์ของคลาสนั้น
โกลาหล

3

การเรียกใช้วิธีการแบบไม่คงที่จะสร้างคำเตือนระดับ E_STRICT แบบคงที่


2

โดยสรุปคุณไม่มีวัตถุเป็น $ this ในกรณีที่สองเนื่องจากวิธีการคงที่เป็นฟังก์ชัน / วิธีการของคลาสไม่ใช่อินสแตนซ์วัตถุ


1
คงเป็นเพียงวิธีที่คุณกำหนดฟังก์ชันคลาส? ไม่มีธุรกิจแฟนซีอื่น ๆ ? คุณกำลังบอกว่าถ้ามันถูกเรียกว่า "class_method" แทนที่จะเป็น "static" มันจะมีความหมายมากกว่านี้ไหม
ahnbizcad

1

หลังจากลองใช้ตัวอย่าง (PHP 5.3.5) ฉันพบว่าในทั้งสองกรณีของการกำหนดฟังก์ชันคุณไม่สามารถใช้$thisตัวดำเนินการเพื่อทำงานกับฟังก์ชันคลาสได้ ดังนั้นฉันยังไม่พบความแตกต่างในพวกเขา :(

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