การเตรียมตัวสำหรับการสัมภาษณ์ PHP: คีย์เวิร์ด “static. ข้อผิดพลาดของตัวแปรคงที่

08/07/2016 18:37 แขกรับเชิญ: Bashibuzuk Alexander

ยอดเยี่ยมมาก!
โครงเรื่อง ตัวละคร บทสนทนา...
ทุกอย่างลงตัวและมีสีสันโดยไม่บิดเบือน
เขียนดีมาก. มันโดดเด่นอย่างมากเมื่อเทียบกับพื้นหลังที่มีมวลกำมะถันตก
สิ่งเดียวคือประเภทและประเภทของอาวุธมากเกินไปโดยไม่มีคำอธิบายที่ถูกต้องเสมอไป แต่สิ่งนี้หายากมาก
กิ๊บเดียวที่ฉันสามารถซื้อได้อย่างจริงจังคือจาก "ทางเข้าจากด้านที่ผิด" - กองพัน Caracal (แมวทะเลทราย) IDF - หน่วยแยกผสม (ชายและหญิง) สำหรับการปฏิบัติการในทะเลทรายและไม่มีอะไรที่เหมือนกันกับกองพล Golani (ลงจอด). ส่วนที่เหลือทุกอย่างถูกต้องอย่างแน่นอน
ขอบคุณมากสำหรับหนังสือ
ฉันอยากเห็นภาคต่อของ Feldkornet จริงๆ
ขอบคุณอีกครั้ง!!!

10/07/2018 07:50 แขกรับเชิญ: Bashibuzuk Alexander

V.I.P.: ครั้งหนึ่งฉันอ่านบาชิบาซุกทั้งหมด แม้ว่านามแฝงจะดูโอ้อวดและโง่เขลา แต่ทุกอย่างก็สามารถอ่านได้ไม่ว่าใครจะพูดอะไรก็ตาม ไม่ว่าในกรณีใด ฉันไม่ได้สังเกตเห็นเรื่องไร้สาระใดๆ ในสิ่งที่ฉันอ่าน ฉันมีความสุขกับผู้ชายคนนั้น ด้วยความหวัง ฉันจึงเปิดไฟล์ล่าสุดของเขาและเปิด "จากประตูหลัง" ของ Flibust ได้อย่างสมเหตุสมผล และด้วยความเสียใจ ฉันมั่นใจอีกครั้งว่าไม่มีความสมบูรณ์แบบใดในโลก GG เป็นพนักงานของ NKVD (เกือบ GRU) แม้ว่าเขาจะเป็นผู้ก่อวินาศกรรม (แม้ว่าเขาจะเป็นเอกจากที่ไหนก็ตาม) แต่มีการศึกษาพิเศษสองครั้งและเริ่มต้นที่มหาวิทยาลัยพลเรือนด้วยซ้ำ แล้วในทุกขั้นตอนของราคาถูกเหล่านี้ ทันที "แม่ง" ทันที "แม่ง" "แม่ง" "แก้ไข" "แม่ง" "แม่ง" "แม่ง" "แม่ง" ก็ “สุนัขจิ้งจอกอาร์กติก” โดยทั่วไปมาจากสมัยของเรา นี่คือจำนวนชั้นเรียนของสุนทรพจน์ดังกล่าวที่จะเข้าถึงได้ และเหตุใดจึงเป็นเช่นนี้ ฉันไม่รู้ว่าจะเกิดอะไรขึ้นต่อไป แต่มีความรู้สึกดั้งเดิมที่เห็นได้ชัดเจนอยู่แล้วจากโครงเรื่อง "โพเซลยาจิน" ที่ตรงไปตรงมาจากรูปแบบการนำเสนอจากการใช้เหตุผลและบทสรุปที่งี่เง่าของตัวละครหลักจากตัวละครกระดาษแข็ง จากบทสนทนาที่ไร้ชีวิตชีวา จากความไม่เป็นจริงของสิ่งที่เกิดขึ้นแม้แต่ในนิยาย ทั้งหมดนี้และอีกมากมายทำให้คุณรู้สึกคลื่นไส้และทำให้คุณอยากหยุดอ่าน ฉันไม่มีทางเข้าใจได้เลยฉันกระจาย "สิ่งที่ไม่เน่าเปื่อย" อ่านมัน (หรือไม่ได้อ่าน?) มันไม่แสบตาจริงๆเหรอ? ท้ายที่สุดแล้ว ให้โยนสิ่งเหล่านี้ออกไปด้วยคำว่า "fuck" (นั่นคือเหตุผลว่าทำไมเพื่อเน้นความเป็นปัจเจกบุคคล แล้วมีไว้เพื่ออะไร หรืออาจจะเป็นความเย็นชา อะไร?) และแม้แต่ข้อความธรรมดา ๆ ก็ฟังดูแตกต่างไปจากเดิมอย่างสิ้นเชิง แล้วถ้าไม่ตัดก็ไม่รู้สิ อาจจะมีคนอื่นเขียนก็ได้ และถ้าเขาถูกปลดประจำการ ก็ควรหยุดการทรมานทางวรรณกรรมและหยุดทรมานความโง่เขลาในยุคดึกดำบรรพ์จะดีกว่า

23/07/2018 13:22 แขกรับเชิญ: Bashibuzuk Alexander

V.I.P.: นอกจาก "โสเภณี" และสิ่งที่คล้ายกัน (อาจยังเป็นคนเรียบง่ายและเท่) แล้ว "คุณรู้" ที่โง่เขลาของบุชและ "ใช่" ที่โง่ยิ่งกว่านั้นก็ปรากฏตัวขึ้น พูดได้คำเดียวว่าครบชุด ถึงกระนั้นฉันก็เข้าใจได้ว่าทุกคนอยากอยู่กับ "ชายร่างใหญ่" และมีผู้หญิงหลายคนในคราวเดียว อย่างน้อยก็ใน "การสร้างสรรค์" ของตัวเอง แต่ถ้ามันเป็นเรื่องดั้งเดิมและลอกเลียนแบบโดยสิ้นเชิง อย่างน้อยเขาก็จะนำสิ่งใหม่เข้ามา ความสัมพันธ์กับอย่างหลัง เขาจะดึงดูดสื่อลามกที่คุณดูหรืออะไรสักอย่าง แม้ว่าความคิดริเริ่มจะมาจากไหน แต่ทั้งหมดก็มีพื้นฐานมาจากสถานการณ์เดียวกัน

แอปพลิเคชัน

ในสงครามกับรัฐในยุโรป บาชิบาโซกิมักจะกลายเป็นว่าไม่สามารถป้องกันได้อย่างสมบูรณ์ เป็นไปไม่ได้ที่จะจัดระเบียบและลงโทษพวกเขาและแม้แต่ความพยายามของนายพลต่างชาติที่เข้ามาทำสิ่งนี้ (นายพลยูซุฟชาวฝรั่งเศส, English Beatson) ก็ไม่ได้ช่วยในทิศทางนี้ เพื่อยุติการปล้นสะดมในประเทศและความโหดร้ายและความรุนแรงที่ไม่อาจจินตนาการได้ที่เกิดขึ้นกับพลเรือน กองกำลังประจำของตุรกีจึงถูกบังคับให้ปลดอาวุธมากกว่าหนึ่งครั้ง บาชิ-บาซูคส์- พวกเขาแสดงให้เห็นอย่างเต็มที่ถึงความโน้มเอียงในการล่าเหยื่อในระหว่างการปราบปรามการจลาจลในเดือนเมษายนในบัลแกเรียและระหว่างสงครามรัสเซีย - ตุรกีครั้งสุดท้ายในปี พ.ศ. 2420-2421

ชื่อเสียง

ชื่อ บาชิ-บาซูคส์ได้กลายเป็นคำที่ใช้ในครัวเรือนเพื่ออธิบายถึงบุคคลที่สามารถใช้ความรุนแรงอย่างอุกอาจที่สุดในความโหดร้ายของมัน กิจกรรมการลงโทษ บาชิ-บาซูคส์อธิบายโดยนักปรัชญาชาวรัสเซีย V.S. Solovyov ในบทความเรื่อง "การสนทนาสามครั้งเกี่ยวกับสงครามความก้าวหน้าและการสิ้นสุดของประวัติศาสตร์โลก" โดยอิงจากเนื้อหาสารคดี

ดูเพิ่มเติม

  • ปินดาริ- ในอินเดีย
  • Serdyuki - ในยูเครน

เขียนบทวิจารณ์เกี่ยวกับบทความ "Bashi-bazouki"

หมายเหตุ

วรรณกรรม

  • // สารานุกรมทหาร: [ใน 18 เล่ม] / ed. V.F. Novitsky [และคนอื่นๆ] - เซนต์ปีเตอร์สเบิร์ก
  • - [ม.]: ประเภท.

ที-วา ไอ.วี. ไซติน, 2454-2458

  • // พจนานุกรมสารานุกรมของ Brockhaus และ Efron: จำนวน 86 เล่ม (82 เล่มและเพิ่มเติม 4 เล่ม) - เซนต์ปีเตอร์สเบิร์ก , พ.ศ. 2433-2450. ลิงค์มอนโกเมอรี, นายอำเภอเบอร์นาร์ด (1968)

ประวัติศาสตร์แห่งสงคราม

,บริษัทสำนักพิมพ์โลก. ไอ 978-0-688-01645-6.
ข้อความที่ตัดตอนมาจากลักษณะบาชิบาซึกิ
ไปตามตรอกของ Khamovniki นักโทษเดินตามลำพังพร้อมกับขบวนรถและเกวียนและเกวียนที่เป็นของผู้คุมและขับตามหลังพวกเขา แต่เมื่อออกไปที่ร้านขายเสบียง พวกเขาพบว่าตัวเองอยู่กลางขบวนปืนใหญ่ขนาดใหญ่ที่เคลื่อนไหวอย่างใกล้ชิดผสมกับเกวียนส่วนตัว
เมื่อผ่านไครเมียฟอร์ดไปแล้ว นักโทษก็ขยับทีละสองสามก้าวแล้วหยุดและเคลื่อนตัวอีกครั้ง และลูกเรือและผู้คนก็รู้สึกเขินอายมากขึ้นทุกด้าน หลังจากเดินกว่าหนึ่งชั่วโมงไม่กี่ร้อยขั้นที่แยกสะพานจากถนน Kaluzhskaya และถึงจัตุรัสที่ถนน Zamoskvoretsky พบกับ Kaluzhskaya นักโทษที่ถูกบีบเป็นกองก็หยุดและยืนอยู่ที่สี่แยกนี้เป็นเวลาหลายชั่วโมง ได้ยินเสียงล้อคำรามไม่หยุดหย่อน เสียงเหยียบย่ำ และเสียงกรีดร้องและคำสาปโกรธไม่หยุดหย่อน ราวกับเสียงทะเล ปิแอร์ยืนพิงผนังบ้านที่ถูกไฟไหม้ฟังเสียงนี้ซึ่งในจินตนาการของเขาผสานเข้ากับเสียงกลอง
เจ้าหน้าที่ที่ถูกจับหลายคน เพื่อให้ได้มุมมองที่ดีขึ้น ปีนขึ้นไปบนกำแพงบ้านที่ถูกไฟไหม้ใกล้กับที่ปิแอร์ยืนอยู่
- ถึงประชาชน! ชาวเอก้า!..ก็เอาปืนมากอง! ดู: ขน... - พวกเขาพูด “ดูสิ ไอ้สารเลว พวกเขาปล้นฉัน... มันอยู่ข้างหลังเขา บนเกวียน... สุดท้ายนี้มาจากไอคอน โดยพระเจ้า!.. พวกนี้ต้องเป็นชาวเยอรมัน” และคนของเรา โดยพระเจ้า!.. โอ้ ไอ้วายร้าย!.. ดูสิ เขาบรรทุกของหนักมาก เขาเดินอย่างมีพลัง! พวกเขามาแล้ว droshky - และพวกเขาก็จับมันได้!.. ดูสิเขานั่งลงบนอก พ่อ!..ทะเลาะกัน!..
- ตบหน้าเขาต่อหน้า! คุณจะไม่สามารถรอจนถึงเย็นได้ ดู ดู... และนี่อาจจะเป็นนโปเลียนเอง เห็นไหมว่าม้าอะไร! ในพระปรมาภิไธยย่อพร้อมมงกุฎ นี่คือบ้านพับ เขาทำกระเป๋าตกแต่มองไม่เห็น พวกเขาทะเลาะกันอีกแล้ว... ผู้หญิงมีลูก และไม่เลวเลย ใช่ พวกเขาจะปล่อยให้คุณผ่านไปได้... ดูสิ ไม่มีที่สิ้นสุด สาวรัสเซีย โดยพระเจ้า สาว ๆ ! พวกเขานั่งรถเข็นได้อย่างสบายมาก!
อีกครั้งที่คลื่นแห่งความอยากรู้อยากเห็นทั่วไปใกล้กับโบสถ์ใน Khamovniki ผลักนักโทษทั้งหมดไปที่ถนนและปิแอร์ด้วยความสูงของเขาที่มองเห็นเหนือหัวของคนอื่น ๆ สิ่งที่ดึงดูดความอยากรู้อยากเห็นของนักโทษ ในรถเข็นเด็กสามคันที่ผสมระหว่างกล่องชาร์จ ผู้หญิงก็ขี่รถ นั่งชิดกัน แต่งกายด้วยสีสันสดใส หน้าแดง ตะโกนอะไรบางอย่างด้วยเสียงแหลม

แม้ว่าโค้ด PHP 5 ที่มีอยู่ส่วนใหญ่ควรจะทำงานได้โดยไม่มีการเปลี่ยนแปลง แต่คุณควรคำนึงถึงการเปลี่ยนแปลงที่เข้ากันไม่ได้แบบย้อนหลังต่อไปนี้:

  • ได้รับความเดือดร้อน()ผลตอบแทน โมฆะเมื่อผ่านข้อโต้แย้งที่เข้ากันไม่ได้ใน PHP 5.2.1
  • ZipArchive::setCommentName()ผลตอบแทน จริงประสบความสำเร็จตั้งแต่ PHP 5.2.1
  • ZipArchive::setCommentIndex()ผลตอบแทน จริงประสบความสำเร็จตั้งแต่ PHP 5.2.1
  • SplFileObject::getFilename() ส่งคืนชื่อไฟล์ ไม่ใช่relative/path/to/file ใน PHP 5.2.1
  • เปลี่ยนลำดับความสำคัญของตัวแปรสภาพแวดล้อม PHPRC บน Win32 ขณะนี้ตัวแปรสภาพแวดล้อม PHPRC มีลำดับความสำคัญเหนือเส้นทางที่จัดเก็บไว้ในรีจิสทรีของ Windows
  • CLI SAPI จะไม่ตรวจสอบ cwd สำหรับ php.ini หรือไฟล์ php-cli.ini อีกต่อไป ใน PHP 5.1.x มีการเพิ่มคุณสมบัติที่ไม่มีเอกสารซึ่งทำให้ไบนารี CLI ตรวจสอบไดเร็กทอรีการทำงานปัจจุบันสำหรับไฟล์การกำหนดค่า PHP ซึ่งอาจนำไปสู่พฤติกรรมที่คาดเดาไม่ได้หากมีการอ่านไฟล์การกำหนดค่าที่ไม่คาดคิด ฟังก์ชันนี้ถูกลบออกในเวอร์ชัน 5.2.0 และ PHP จะไม่ค้นหา CWD อีกต่อไปว่ามีไฟล์ php.ini หรือ php-cli.ini อีกต่อไป
  • โปรดดูส่วนบรรทัดคำสั่งของคู่มือด้วย เพิ่มคำเตือนเมื่อดำเนินการโมดูลัส 0 ใน PHP เวอร์ชันก่อนหน้า การดำเนินการเป็นจำนวนเต็ม % 0 ไม่ได้แสดงข้อความเตือนใดๆ แต่กลับคืนค่าที่ส่งคืนโดยไม่คาดคิดเป็นเท็จ - ตั้งแต่ PHP 5.2.0 การดำเนินการนี้จะปล่อยไฟล์ E_คำเตือน

    เช่นเดียวกับในกรณีอื่นๆ ทั้งหมดที่มีการหารด้วยศูนย์
    พิมพ์ 10% 0 ;
    ?>

  • /* คำเตือน: หารด้วยศูนย์ในชื่อไฟล์ในบรรทัด n */ เปลี่ยน __toString() เพื่อให้สามารถเรียกได้ทุกที่ ตอนนี้เมธอดเวทย์มนตร์ __toString() จะถูกเรียกในบริบทของสตริง นั่นคือทุกที่ที่มีการใช้อ็อบเจ็กต์เป็นสตริง

    ทางเลือกของการส่งคืนสตริงที่มีตัวระบุวัตถุถูกทิ้งใน PHP 5.2.0 มันกลายเป็นปัญหาเนื่องจากตัวระบุอ็อบเจ็กต์ไม่สามารถพิจารณาว่าไม่ซ้ำกัน การเปลี่ยนแปลงนี้จะหมายความว่าแอปพลิเคชันของคุณมีข้อบกพร่องหากคุณใช้ตัวระบุวัตถุเป็นค่าส่งคืน ความพยายามที่จะใช้ค่านั้นเป็นสตริงจะส่งผลให้เกิดข้อผิดพลาดร้ายแรงที่สามารถตรวจจับได้
    คลาสฟู()
    $foo = ฟูใหม่ ;
    พิมพ์ $foo ;
    /* ข้อผิดพลาดร้ายแรงที่ตรวจจับได้: วัตถุของคลาส foo ทำได้
    ?>

    ไม่ถูกแปลงเป็นสตริงในชื่อไฟล์ในบรรทัด n */ แม้จะมี __toString() วัตถุก็ไม่สามารถใช้เป็นดัชนีอาร์เรย์หรือคีย์ได้ เราอาจเพิ่มการรองรับแฮชในตัวสำหรับสิ่งนี้ในภายหลัง แต่สำหรับ PHP 5.2.x คุณจะต้องจัดเตรียมการแฮชของคุณเองหรือใช้ฟังก์ชัน SPL ใหม่. spl_object_hash()

    ไม่สามารถโยนข้อยกเว้นจากวิธีการ __toString() ได้
    คลาสฟู (
    ฟังก์ชั่นสาธารณะ __toString() (
    }
    }

    โยนข้อยกเว้นใหม่ ;
    พยายาม (
    พิมพ์ foo ใหม่ ;
    /* ข้อผิดพลาดร้ายแรง: ต้องใช้วิธีการ foo::__toString()
    ไม่ส่งข้อยกเว้นในชื่อไฟล์ในบรรทัด n */
    ?>

  • ) catch(ยกเว้น $e ) () ยกเลิกฟังก์ชันคลาสสแตติกนามธรรมแบบนามธรรม

    เนื่องจากการกำกับดูแล PHP 5.0.x และ 5.1.x อนุญาตให้ใช้ฟังก์ชันสแตติกนามธรรมในคลาสได้ สำหรับ PHP 5.2.x มีเพียงอินเทอร์เฟซเท่านั้นที่สามารถมีได้ {
    คลาสนามธรรม foo
    ฟังก์ชันคงที่เชิงนามธรรม
    บาร์();
    /* มาตรฐานที่เข้มงวด: ฟังก์ชันคงที่ foo::bar()
    }
    ?>

  • ไม่ควรเป็นนามธรรมในชื่อไฟล์ในบรรทัด n */
  • ส่วนขยายของ Oracle ต้องการ Oracle 10 เป็นอย่างน้อยบน Windows เพิ่ม RFC2397 (ข้อมูล: การแนะนำโครงร่าง URL "ข้อมูล" มีศักยภาพที่จะนำไปสู่การเปลี่ยนแปลงลักษณะการทำงานภายใต้ Windows หากคุณกำลังทำงานกับระบบไฟล์ NTFS และใช้เมตาสตรีมในแอปพลิเคชันของคุณ และหากคุณบังเอิญใช้ไฟล์ชื่อ "data:" ซึ่งเข้าถึงได้โดยไม่มีข้อมูลพาธ ไฟล์นั้นจะไม่ทำงานเลย เพิ่มเติม การแก้ไขคือใช้โปรโตคอล "file:" เมื่อเข้าถึง ดูเพิ่มเติม » RFC 2397

    /* เมื่อ Allow_url_include ปิดอยู่ (ค่าเริ่มต้น) */
    รวม "ข้อมูล:;base64,PD9waHAgcGhwaW5mbygpOz8+";
    /* คำเตือน: รวม (): การเข้าถึงไฟล์ URL ถูกปิดใช้งาน
    ในการกำหนดค่าเซิร์ฟเวอร์ในชื่อไฟล์ออนไลน์ n */
    ?>

  • การถดถอยใน ลูกโลก()รูปแบบ ในเวอร์ชัน 5.2.4 การแก้ไขด้านความปลอดภัยทำให้เกิดการถดถอยสำหรับรูปแบบของรูปแบบ "/foo/*/bar/*" ตั้งแต่เวอร์ชัน 5.2.5 แทนที่จะเพิ่มคำเตือน ลูกโลก()ฟังก์ชั่นจะกลับมา ใน PHP เวอร์ชันก่อนหน้า การดำเนินการเป็นจำนวนเต็ม % 0 ไม่ได้แสดงข้อความเตือนใดๆ แต่กลับคืนค่าที่ส่งคืนโดยไม่คาดคิดเป็นเมื่อไร openbase_dirมีการละเมิดข้อจำกัด
  • บทช่วยสอน

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

ลองแยกคำถามเหล่านี้ออกทีละข้อ - คำว่า "คงที่" หมายถึงอะไรใน PHP และเหตุใดจึงใช้?

คำหลักแบบคงที่มีความหมายที่แตกต่างกันสามประการใน PHP ลองดูตามลำดับเวลาตามที่ปรากฏในภาษา

ค่าแรกคือตัวแปรท้องถิ่นแบบคงที่

ฟังก์ชั่น foo() ( $a = 0; echo $a; $a = $a + 1; ) foo(); // 0 foo(); // 0 foo(); // 0

ใน PHP ตัวแปรอยู่ในเครื่อง ซึ่งหมายความว่าตัวแปรที่กำหนดและกำหนดค่าภายในฟังก์ชัน (วิธีการ) จะมีอยู่เฉพาะในระหว่างการทำงานของฟังก์ชัน (วิธีการ) นั้นเท่านั้น เมื่อเมธอดออก ตัวแปรในเครื่องจะถูกทำลาย และเมื่อกลับเข้ามาใหม่ ตัวแปรจะถูกสร้างขึ้นใหม่ ในโค้ดด้านบน ตัวแปรโลคอลดังกล่าวคือตัวแปร $a ซึ่งมีอยู่ภายในฟังก์ชัน foo() เท่านั้น และจะถูกสร้างขึ้นใหม่ทุกครั้งที่เรียกใช้ฟังก์ชันนี้ การเพิ่มตัวแปรในโค้ดนี้ไม่มีความหมาย เนื่องจากในบรรทัดถัดไปของโค้ด ฟังก์ชันจะทำงานให้เสร็จ และค่าของตัวแปรจะหายไป ไม่ว่าเราจะเรียกใช้ฟังก์ชัน foo() กี่ครั้ง ฟังก์ชันก็จะส่งออกเป็น 0...

อย่างไรก็ตาม ทุกอย่างจะเปลี่ยนไปหากเราใส่ static keyword ก่อนการมอบหมายงาน:

ฟังก์ชั่น foo() ( static $a = 0; echo $a; $a = $a + 1; ) foo(); // 0 foo(); // 1 foo(); // 2

คีย์เวิร์ดแบบคงที่ซึ่งเขียนก่อนกำหนดค่าให้กับตัวแปรโลคัลจะมีผลกระทบดังต่อไปนี้:

  1. การมอบหมายจะดำเนินการเพียงครั้งเดียวในการเรียกฟังก์ชันครั้งแรก
  2. ค่าของตัวแปรที่ทำเครื่องหมายด้วยวิธีนี้จะถูกบันทึกหลังจากฟังก์ชันสิ้นสุด
  3. ในการเรียกใช้ฟังก์ชันครั้งต่อๆ ไป แทนที่จะกำหนด ตัวแปรจะได้รับค่าที่เก็บไว้ก่อนหน้านี้
การใช้คำว่าคงที่นี้เรียกว่า ตัวแปรท้องถิ่นแบบคงที่.
ข้อผิดพลาดของตัวแปรคงที่
แน่นอนว่า PHP ก็มีข้อผิดพลาดอยู่บ้างเช่นเคย

แนวทางแรกคือเฉพาะค่าคงที่หรือนิพจน์คงที่เท่านั้นที่สามารถกำหนดให้กับตัวแปรคงที่ได้นี่คือรหัส:
คงที่ $a = bar();
จะนำไปสู่ข้อผิดพลาดของพาร์เซอร์อย่างหลีกเลี่ยงไม่ได้ โชคดีที่เริ่มต้นด้วยเวอร์ชัน 5.6 คุณสามารถกำหนดไม่เพียงแต่ค่าคงที่เท่านั้น แต่ยังรวมถึงนิพจน์คงที่ด้วย (เช่น "1+2" ​​หรือ "") นั่นคือนิพจน์ที่ไม่ขึ้นอยู่กับโค้ดอื่นและสามารถคำนวณได้ ในขั้นตอนการรวบรวม

หินก้อนที่สองคือวิธีการที่มีอยู่ในสำเนาเดียว
ที่นี่ทุกอย่างซับซ้อนขึ้นเล็กน้อย เพื่อทำความเข้าใจสาระสำคัญ นี่คือรหัส:
คลาส A ( ฟังก์ชั่นสาธารณะ foo() ( static $x = 0; echo ++$x; ) ) $a1 = new A; $a2 = A ใหม่; $a1->ฟู(); // 1 $a2->foo(); // 2 $a1->foo(); // 3 $a2->foo(); // 4
ตรงกันข้ามกับความคาดหวังตามสัญชาตญาณ "วัตถุที่แตกต่างกัน - วิธีการที่แตกต่างกัน" เราเห็นอย่างชัดเจนในตัวอย่างนี้ว่าวิธีการแบบไดนามิกใน PHP "ไม่คูณ" แม้ว่าเราจะมีวัตถุเป็นร้อยในคลาสนี้ แต่วิธีการจะมีอยู่ในอินสแตนซ์เดียวเท่านั้น เพียงแต่ว่า $this ที่แตกต่างกันจะถูกโยนเข้าไปในการเรียกแต่ละครั้ง

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

คลาส A ( ฟังก์ชั่นสาธารณะ foo() ( static $x = 0; echo ++$x; ) ) คลาส B ขยาย A ( ) $a1 = new A; $b1 = B ใหม่; $a1->ฟู(); // 1 $b1->foo(); // 1 $a1->foo(); // 2 $b1->foo(); // 2

สรุป: วิธีการแบบไดนามิกใน PHP มีอยู่ในบริบทของคลาส ไม่ใช่วัตถุ และเฉพาะในรันไทม์เท่านั้นที่การแทนที่ “$this = current_object” จะเกิดขึ้น

ความหมายที่สองคือคุณสมบัติคงที่และวิธีการเรียน

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

คลาส A ( public static $x = "foo"; public static function test() ( return 42; ) ) echo A::$x; // "foo" echo A::test(); // 42
ในการเข้าถึงคุณสมบัติและวิธีการดังกล่าว จะใช้โครงสร้าง double-colon (“Paamayim Nekudotayim”) เช่น CLASS_NAME::$Variablename และ CLASS_NAME::Methodname()

ไม่ต้องบอกว่าคุณสมบัติคงที่และวิธีการคงที่มีลักษณะเฉพาะและข้อผิดพลาดของตัวเองที่คุณจำเป็นต้องรู้

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

อย่างไรก็ตาม คุณต้องรู้ว่า PHP ไม่เหมือนกับภาษาอื่นๆ ตรงที่ตรวจไม่พบสถานการณ์ “$this is wrote in a static method” ในขั้นตอนการแยกวิเคราะห์หรือคอมไพล์ ข้อผิดพลาดเช่นนี้สามารถเกิดขึ้นได้ที่รันไทม์เท่านั้นหากคุณพยายามรันโค้ดด้วย $this ภายในวิธีการแบบคงที่

รหัสเช่นนี้:
คลาส A ( public $id = 42; ฟังก์ชันสาธารณะแบบคงที่ foo() ( echo $this->id; ) )
จะไม่ทำให้เกิดข้อผิดพลาดใดๆ ตราบใดที่คุณไม่ได้พยายามใช้เมธอด foo() อย่างไม่เหมาะสม:
$a = ก ใหม่; $a->foo();

(และได้รับ “ข้อผิดพลาดร้ายแรง: การใช้ $this เมื่อไม่อยู่ในบริบทของวัตถุ”) ทันที
คุณลักษณะที่สองคือคงที่ไม่ใช่สัจพจน์!
คลาส A ( ฟังก์ชั่นสาธารณะแบบคงที่ foo() ( echo 42; ) ) $a = new A; $a->foo();

แค่นั้นแหละใช่ วิธีการแบบสแตติก หากไม่มี $this ในโค้ด ก็สามารถเรียกได้ในบริบทแบบไดนามิก เช่น วิธีการแบบอ็อบเจ็กต์ นี่ไม่ใช่จุดบกพร่องใน PHP
สิ่งที่ตรงกันข้ามไม่เป็นความจริงทั้งหมด:
คลาส A ( ฟังก์ชั่นสาธารณะ foo() ( echo 42; ) ) A::foo();

วิธีการแบบไดนามิกที่ไม่ได้ใช้ $this สามารถดำเนินการได้ในบริบทคงที่ อย่างไรก็ตาม คุณจะได้รับคำเตือน "ไม่ควรเรียกเมธอด A::foo() แบบคงที่" ที่ระดับ E_STRICT ขึ้นอยู่กับคุณที่จะตัดสินใจว่าจะปฏิบัติตามมาตรฐานโค้ดอย่างเคร่งครัดหรือระงับคำเตือน แน่นอนว่าอันแรกจะดีกว่า

อย่างไรก็ตามทุกสิ่งที่เขียนข้างต้นใช้ได้กับวิธีการเท่านั้น การใช้คุณสมบัติคงที่ผ่าน "->" เป็นไปไม่ได้และทำให้เกิดข้อผิดพลาดร้ายแรง

ความหมายที่สามซึ่งดูเหมือนจะยากที่สุด - การผูกแบบคงที่ล่าช้า

นักพัฒนาภาษา PHP ไม่ได้หยุดอยู่เพียงสองความหมายของคำว่า "คงที่" และในเวอร์ชัน 5.3 ได้เพิ่ม "คุณสมบัติ" ของภาษาอีกอันหนึ่งซึ่งใช้งานด้วยคำเดียวกัน! เรียกว่า "Late Static Binding" หรือ LSB (Late Static Binding)

โมเดลคลาส ( public static $table = "table"; public static function getTable() ( return self::$table; ) ) echo Model::getTable(); // "โต๊ะ"
คีย์เวิร์ด self ใน PHP มักจะหมายถึง "ชื่อของคลาสที่เขียนคำนี้" ในกรณีนี้ self จะถูกแทนที่ด้วยคลาส Model และ self::$table ด้วย Model::$table
คุณลักษณะภาษานี้เรียกว่า "การเชื่อมโยงแบบคงที่ล่วงหน้า" ทำไมเร็ว? เนื่องจากการผูกตนเองและชื่อคลาสเฉพาะไม่ได้เกิดขึ้นในรันไทม์ แต่ในขั้นตอนก่อนหน้า - การแยกวิเคราะห์และการคอมไพล์โค้ด “คงที่” - เพราะเรากำลังพูดถึงคุณสมบัติและวิธีการคงที่

มาเปลี่ยนรหัสของเรากันหน่อย:

โมเดลคลาส ( public static $table = "table"; public static function getTable() ( return self::$table; ) ) class User ขยายโมเดล ( public static $table = "users"; ) echo User::getTable() ; // "โต๊ะ"

ตอนนี้คุณเข้าใจแล้วว่าทำไม PHP ถึงทำงานโดยไม่ตั้งใจในสถานการณ์นี้ self เชื่อมโยงกับคลาส Model เมื่อไม่มีความรู้เกี่ยวกับคลาส User จึงชี้ไปที่ Model

ฉันควรทำอย่างไร?

เพื่อแก้ปัญหาภาวะที่กลืนไม่เข้าคายไม่ออกนี้ กลไกการเชื่อมโยง "ล่าช้า" จึงถูกประดิษฐ์ขึ้นในขั้นตอนรันไทม์ มันใช้งานได้ง่ายมาก - เพียงแค่เขียน "static" แทนคำว่า "self" และการเชื่อมต่อกับคลาสที่เรียกโค้ดนี้จะเกิดขึ้น ไม่ใช่กับคลาสที่เขียนไว้:
class Model ( public static $table = "table"; public static function getTable() ( return static::$table; ) ) class User ขยายโมเดล ( public static $table = "users"; ) echo User::getTable() ; // "ผู้ใช้"

นี่คือ "การผูกมัดแบบคงที่ล่าช้า" อันลึกลับ

ควรสังเกตว่าเพื่อความสะดวกยิ่งขึ้นใน PHP นอกเหนือจากคำว่า "คงที่" แล้วยังมีฟังก์ชันพิเศษ get_call_class() ซึ่งจะบอกคุณในบริบทว่าโค้ดของคุณกำลังทำงานอยู่ในคลาสใด

สัมภาษณ์สุขสันต์!