ฟังก์ชันนิรนามหรือแลมบ์ดาใน php การปิดใน PHP ตัวอย่างของฟังก์ชันปกติ
สามารถกำหนดฟังก์ชันให้กับตัวแปรได้ เช่นเดียวกับค่าปกติ ในการดำเนินการนี้ ชื่อฟังก์ชันจะต้องถูกกำหนดให้กับตัวแปรเป็นสตริง แต่ไม่ต้องระบุวงเล็บ:
\n"; ) $my_func = "foo"; // ตอนนี้เราสามารถรันฟังก์ชัน foo() โดยใช้ตัวแปร $my_func, // ซึ่งเก็บชื่อของฟังก์ชันที่ระบุเป็นสตริง $my_func(); // Call ฟังก์ชัน foo() ?>
แนวคิด PHP นี้เรียกว่าตัวแปรฟังก์ชัน มันอยู่ในความจริงที่ว่าถ้าคุณเพิ่มวงเล็บให้กับตัวแปรในตอนท้ายล่าม PHP จะตรวจสอบก่อนว่ามีฟังก์ชันที่มีชื่อเท่ากับหรือไม่ ความหมายตัวแปร และหากมีฟังก์ชันดังกล่าวอยู่ ก็จะดำเนินการฟังก์ชันดังกล่าว
ดังที่แสดงในตัวอย่างข้างต้น สามารถทำได้ด้วยฟังก์ชันของผู้ใช้ที่ระบุเท่านั้น โครงสร้างภาษาและฟังก์ชันในตัว เช่น echo, unset(), isset() และอื่นๆ ไม่สามารถกำหนดให้กับตัวแปรโดยตรงในลักษณะเดียวกันได้ แต่คุณสามารถสร้างฟังก์ชัน wrapper ของคุณเองได้ เพื่อให้โครงสร้างภาษาในตัวสามารถทำงานได้เหมือนกับฟังก์ชันที่ผู้ใช้กำหนด
ฟังก์ชั่นที่ไม่ระบุชื่อ
ฟังก์ชั่นที่ไม่ระบุชื่อ- ฟังก์ชั่นที่ไม่มีชื่อของตัวเอง บางครั้งคุณสามารถค้นหาชื่ออื่นสำหรับฟังก์ชั่นดังกล่าวได้ - ฟังก์ชันแลมบ์ดา ฟังก์ชันที่ไม่ระบุชื่อสามารถส่งผ่านไปยังฟังก์ชันอื่นเป็นอาร์กิวเมนต์หรือกำหนดให้กับตัวแปรเช่นค่าปกติ:
โปรดใส่ใจกับตัวอย่าง ในตอนท้ายของคำจำกัดความฟังก์ชันจะมีเครื่องหมายอัฒภาค เนื่องจากฟังก์ชันที่ไม่ระบุชื่อนั้นเป็นค่าและเรากำหนดค่าให้กับตัวแปร จากนั้นในตอนท้ายสำหรับคำสั่งทั่วไป เครื่องหมายอัฒภาคจะถูกวางไว้ .
ฟังก์ชันที่ไม่ระบุชื่อแตกต่างจากฟังก์ชันที่มีชื่อตรงที่ฟังก์ชันเหล่านี้ถูกสร้างขึ้นในช่วงเวลาที่การดำเนินการมาถึงเท่านั้น ดังนั้นจึงสามารถใช้ได้หลังจากกำหนดไว้แล้วเท่านั้น:
วิกิพีเดียบอกว่าฟังก์ชันที่ไม่ระบุตัวตนเป็นฟังก์ชันที่สามารถดำรงอยู่ได้โดยไม่ต้องใช้ตัวระบุ ฟังดูน่าสนใจทีเดียว! ในบทช่วยสอนนี้ ฉันจะแสดงตัวอย่างวิธีที่คุณสามารถสร้างและเรียกใช้ฟังก์ชันโดยใช้วิธีที่ไม่เป็นมาตรฐาน
เริ่มจากตัวอย่างทันที:
การทดสอบฟังก์ชัน($var) ( echo "นี่คือ $var"; )
นี่เป็นฟังก์ชันที่ง่ายมาก ตอนนี้ นอกเหนือจากการเรียกปกติแล้ว เรายังสามารถเรียกใช้ฟังก์ชันนี้โดยใช้ตัวแปรที่เก็บชื่อของฟังก์ชันนี้ได้ บางสิ่งเช่นนี้:
$f = "ทดสอบ"; $f("ฟังก์ชันตัวแปร");
หากคุณรันโค้ด คุณจะเห็นข้อความ This is Variable Function โปรดทราบว่าการประมวลผลราคาเดี่ยวจะเร็วกว่าราคาคู่
เราสามารถใช้เทคนิคนี้ใน OOP ได้เช่นกัน ตัวอย่างจาก php.net:
Class Foo ( function Variable() ( $name = "Bar"; $this->$name(); // เรียกเมธอด Bar() ) function Bar() ( echo "This is Bar"; ) ) $foo = ใหม่ ฟู(); $funcname = "ตัวแปร"; $foo->$funcname(); // สิ่งนี้เรียก $foo->Variable()
แนวคิดนี้ค่อนข้างน่าสนใจ สามารถใช้ในการดำเนินการเรียกกลับ ตารางฟังก์ชัน และอื่นๆ
ตอนนี้ฉันจะพยายามอธิบายให้คุณฟังว่าฟังก์ชันที่ไม่ระบุตัวตนคืออะไร:
$อินพุต = อาร์เรย์(1, 2, 3, 4, 5); $output = array_filter($input, function ($v) ( return $v > 2; ));
function ($v) ( return $v > 2; ) เป็นฟังก์ชันที่ไม่ระบุชื่อ นอกจากนี้เรายังสามารถกำหนดให้กับตัวแปรเพื่อใช้ในภายหลังได้
$max = ฟังก์ชั่น ($v) ( กลับ $v > 2; ); $อินพุต = อาร์เรย์(1, 2, 3, 4, 5); $output = array_filter($อินพุต, $สูงสุด);
ตอนนี้เรามาดูคำหลักการใช้งานใหม่กัน มาเขียนฟังก์ชันที่ไม่ระบุชื่ออื่นสำหรับสิ่งนี้ (ใช้ได้กับ PHP 5.3):
$max_comp = function ($max) ( return function ($v) use ($max) ( return $v > $max; ); ); $อินพุต = อาร์เรย์(1, 2, 3, 4, 5); $output = array_filter($input, $max_comp(2));
ในตัวอย่างนี้ เราใช้เอฟเฟกต์การปิดโดยใช้คีย์เวิร์ด use เทคนิคนี้ช่วยให้ฟังก์ชันที่ไม่ระบุชื่อสามารถเข้าถึงตัวแปรภายนอกได้ มีความรู้เกี่ยวกับการเขียนโปรแกรมตามขั้นตอนบ้างไหม?
นี่เป็นอีกตัวอย่างที่ง่ายกว่านี้:
$string = "สวัสดีชาวโลก!"; $closure = function() ใช้ ($string) ( echo $string; ); $ปิด();
ดังที่ผมได้กล่าวไปแล้ว ตัวแปรที่เราต้องการใช้ (จากขอบเขตส่วนกลาง) ในฟังก์ชันดังกล่าวจะต้องผ่านการนำไปใช้งาน สิ่งสำคัญคือต้องทราบว่าโดยค่าเริ่มต้นเฉพาะค่าเท่านั้นที่จะถูกส่ง ดังนั้นหากคุณต้องการเปลี่ยนเนื้อหาของตัวแปรที่ถูกส่งและต้องการให้เปลี่ยนนอกฟังก์ชันที่ไม่ระบุชื่อ ให้ส่งค่าไปที่:
$x = 1; $closure = function() ใช้ (&$x) ( ++$x; ); เสียงสะท้อน $x -
"; $closure(); echo $x ."
"; $closure(); echo $x ."
";
ในตัวอย่างนี้ เมธอดของเราจะเปลี่ยนแปลงเนื้อหาของตัวแปร $x ทุกครั้งที่มีการเรียกใช้ฟังก์ชันที่ไม่ระบุชื่อ หากเราไม่ส่งที่อยู่ของตัวแปร แต่ส่งผ่านตัวตัวแปรเอง เราจะแสดง 1 สามตัว
ความงามที่แท้จริงของการปิดคือการไม่เกะกะเนมสเปซระดับโลก ทันทีที่ฟังก์ชันนิรนามได้เสร็จสิ้นการทำงาน ตัวแปรทั้งหมดที่ใช้ในฟังก์ชันนั้นจะถูกทำลายโดยอัตโนมัติ
การปิดหรือฟังก์ชันที่ไม่ระบุชื่อใน PHP เป็นฟังก์ชันปกติแต่ไม่มีชื่อ ลองดูตัวอย่างฟังก์ชันดังกล่าว:
ตัวอย่างนี้มีฟังก์ชันที่ไม่ระบุชื่อ แต่ก็ไม่สมเหตุสมผล คำถามเกิดขึ้น - จะใช้ฟังก์ชั่นดังกล่าวได้อย่างไร? ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจสิ่งนี้:
ในตัวอย่างนี้ เราได้กำหนดฟังก์ชันที่ไม่ระบุชื่อให้กับตัวแปร จากนั้นจึงเริ่มดำเนินการฟังก์ชันนี้โดยใช้ไวยากรณ์ $closure(); นั่นคือเราได้เพิ่มวงเล็บให้กับชื่อตัวแปร เช่นเดียวกับเมื่อเรียกใช้ฟังก์ชัน โปรดทราบว่าเราไม่ได้ลบเครื่องหมาย $ ในชื่อตัวแปร
แต่ตัวอย่างนี้ไม่สะดวกในการใช้งานเป็นพิเศษ เนื่องจากคุณสามารถใช้ฟังก์ชันง่ายๆ ได้เช่นกัน
วิธีปิดใช้ในทางปฏิบัติ
โดยทั่วไปแล้วฟังก์ชันหรือการปิดที่ไม่ระบุชื่อใน PHP จะถูกใช้เพื่อส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชันอื่น PHP มีฟังก์ชันในตัวหลายอย่างที่ใช้การปิดเป็นอาร์กิวเมนต์ แต่จะกล่าวถึงด้านล่างนี้
มาทำให้ตัวอย่างของเราซับซ้อนยิ่งขึ้น
ที่นี่เราสร้างฟังก์ชัน doStuff() ปกติและส่งผ่านฟังก์ชันที่ไม่ระบุตัวตนของเราจากตัวแปร $closure เป็นพารามิเตอร์ จากนั้นจึงรันฟังก์ชันนั้นในเนื้อความของฟังก์ชัน doStuff()
ในตัวอย่างนี้ ฟังก์ชัน doStuff() ไม่มีการตรวจสอบประเภทสำหรับตัวแปร $closure เพื่อให้ฟังก์ชัน doStuff() ทำงานได้อย่างถูกต้อง พารามิเตอร์จะต้องมีฟังก์ชันที่ไม่ระบุชื่อ
ฟังก์ชัน is_callable()
ฟังก์ชั่นที่ไม่ระบุชื่อใน PHP ถูกนำมาใช้โดยใช้คลาสการปิดในตัว (PHP 5 >= 5.3.0, PHP 7) นั่นคือฟังก์ชันที่ไม่ระบุชื่อทุกฟังก์ชันเป็นอ็อบเจ็กต์ของคลาสนี้
ออบเจ็กต์ของคลาส Closed เรียกอีกอย่างว่า Callbacks/Callables pseudotype คุณสามารถตรวจสอบว่าตัวแปรอยู่ในประเภทข้อมูลนี้หรือไม่โดยใช้ฟังก์ชัน is_callable()
"; print_r($closure); ) ) $closure = function())( echo "สวัสดีชาวโลก!"; ); doStuff($closure); ?>
โปรดทราบว่าฟังก์ชัน gettype จะกำหนดประเภทของตัวแปร $closure ให้เป็นออบเจ็กต์ ดังนั้น ฟังก์ชัน is_object จะส่งคืนค่า true ด้วย แต่นี่ไม่ใช่การตรวจสอบที่เพียงพอในกรณีของเรา จำเป็นต้องตรวจสอบการปิดโดยใช้ฟังก์ชัน is_callable
ใช้โครงสร้าง
ในฟังก์ชันที่ไม่ระบุชื่อ คุณสามารถสร้างตัวแปรจากขอบเขตพาเรนต์ที่มองเห็นได้โดยใช้โครงสร้างการใช้งาน นี่คือตัวอย่าง:
การใช้คีย์เวิร์ด use คุณสามารถส่งผ่านตัวแปรหลายตัวไปยังฟังก์ชันที่ไม่ระบุชื่อได้ โดยจะแสดงรายการอยู่ในวงเล็บ โดยคั่นด้วยเครื่องหมายจุลภาค
สิ่งสำคัญคือต้องเข้าใจว่าโครงสร้างการใช้งานทำให้มองเห็นได้เฉพาะตัวแปรจากขอบเขตหลัก และนี่ไม่เหมือนกับตัวแปรจากขอบเขตส่วนกลาง ขอบเขตส่วนกลางไม่เปลี่ยนแปลงตามการเปลี่ยนแปลงในการดำเนินการฟังก์ชันที่มีระดับการซ้อนที่แตกต่างกัน
อาร์กิวเมนต์ในฟังก์ชันที่ไม่ระบุชื่อ
คุณสามารถส่งผ่านข้อโต้แย้งไปยังฟังก์ชันที่ไม่ระบุชื่อได้ ลองส่งอาร์กิวเมนต์หนึ่งตัวไปยังฟังก์ชันของเราเป็นตัวอย่าง
" . $argument; ); doStuff($closure); ?>
ด้วยการโต้แย้งทุกอย่างนั้นง่ายมากฟังก์ชั่นที่ไม่ระบุชื่อที่นี่ไม่แตกต่างจากฟังก์ชั่นทั่วไป
ฟังก์ชัน preg_replace_callback
ฉันสัญญาไว้หลายตัวในตัว ฟังก์ชั่น PHPซึ่งใช้การปิดเป็นอาร์กิวเมนต์ นี่คือหนึ่งในนั้น: preg_replace_callback
preg_replace_callback - ค้นหาโดย การแสดงออกปกติและการแทนที่โดยใช้ฟังก์ชันโทรกลับ (ปิด)
Preg_replace_callback ($รูปแบบ, $โทรกลับ, $หัวเรื่อง)
- $pattern - รูปแบบที่ต้องการ อาจเป็นสตริงหรืออาร์เรย์ของสตริงก็ได้
- $callback - ฟังก์ชันการโทรกลับที่จะเรียกใช้ ซึ่งจะถูกส่งผ่านอาร์เรย์ขององค์ประกอบที่ตรงกันจากสตริงหัวเรื่อง ฟังก์ชันโทรกลับควรส่งคืนสตริงที่มีการแทนที่
- $subject - สตริงหรืออาร์เรย์ของสตริงที่จะค้นหาและแทนที่
นี่เป็นไวยากรณ์สั้นๆ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความสามารถของฟังก์ชันนี้ได้บนเว็บไซต์คู่มือ PHP
ฟังก์ชันเพิ่มเติมที่ใช้การปิดเป็นอาร์กิวเมนต์: array_filter, array_map, array_reduce, usort
ฟังก์ชัน call_user_func
ฟังก์ชั่น call_user_func - เรียกใช้ฟังก์ชันผู้ใช้ที่ระบุในพารามิเตอร์แรก ส่งกลับผลลัพธ์ของฟังก์ชัน หรือ FALSE เมื่อเกิดข้อผิดพลาด
ตัวอย่างการใช้ call_user_func:
ตัวอย่างการใช้ call_user_func ใน OOP
ปิดคลาส
ตามที่ฉันได้เขียนไปแล้ว ฟังก์ชันที่ไม่ระบุชื่อใน PHP จะถูกนำไปใช้โดยใช้คลาสการปิด ฟังก์ชันที่ไม่ระบุชื่อทั้งหมดเป็นอ็อบเจ็กต์ของคลาสบิวท์อินนี้
โปรดทราบด้วยว่าเมื่อเรียกวัตถุเป็นฟังก์ชัน วัตถุนั้นจะถูกเรียกใช้ วิธีเวทย์มนตร์ __ เรียกใช้ (ตั้งแต่ PHP5.3)
ผลรวม: " . ($variable + $variable_out); ); ) $r = doStuff(); $r(35); doStuff()->__inurge(5);
สวัสดีทุกคน และวันนี้เราจะมาพูดถึง ฟังก์ชั่นที่ไม่ระบุตัวตนใน php คืออะไรและจะใช้ที่ไหน
ฟังก์ชั่นที่ไม่ระบุชื่อหรือในทางอื่น ฟังก์ชันแลมบ์ดาเป็นฟังก์ชันที่ไม่มีชื่อ
ตัวอย่างของฟังก์ชันปกติ
ฟังก์ชั่น FuName($txt) (echo "ข้อความของฉัน: ".$txt;
}
$func = "FuName";
$func("ข้อความของฉัน");
?>
เรามีฟังก์ชันที่รับหนึ่งพารามิเตอร์ ต่อไปเราจะเขียนชื่อฟังก์ชันลงในตัวแปรแล้วเรียกมัน ไม่มีอะไรผิดปกติ ใน อุ๊ยสไตล์มันจะสมเหตุสมผลมากขึ้น
คลาส MyClass(
แถบฟังก์ชัน() (
// รหัส
}
}
$คลาส = MyClass ใหม่();
$func = "บาร์";
$คลาส->$func();
?>
ฟังก์ชั่นที่ไม่ระบุชื่อ
หากคุณคุ้นเคยกับฟังก์ชั่นที่ไม่ระบุชื่อจากภาษา จาวาสคริปต์แล้วคุณจะเข้าใจว่าทำไมจึงจำเป็น และถ้าไม่ ก็อ่านต่อ
หากต้องการเรียกใช้ฟังก์ชันที่ไม่ระบุตัวตนของเราที่ใดที่หนึ่งเพิ่มเติมในโค้ดโปรแกรม เราสามารถกำหนดฟังก์ชันดังกล่าวให้กับตัวแปรได้
$func = ฟังก์ชั่น() (
// รหัส
};
$ฟังก์ชั่น();
?>
สังเกตว่าส่วนท้ายมี ; , เพราะ เรากำหนดค่าตัวแปรให้เท่ากับฟังก์ชัน แต่ประเด็นทั้งหมดไม่ใช่สิ่งนี้ แต่เป็นความจริงที่ว่าเราสามารถใช้ฟังก์ชันเหล่านี้เป็นได้ ฟังก์ชั่นการโทรกลับ- ตัวอย่างเช่น:
$val = array_filter($input, function ($v) ( return $v > 2; ));
?>
การใช้คำหลัก
อีกครั้งถ้าคุณรู้ จาวาสคริปต์แล้วนี่จะไม่เป็นปัญหาสำหรับคุณ คำสำคัญใช้ช่วยให้คุณสามารถใช้เทคนิคได้ การปิด, เช่น. ด้วยความช่วยเหลือเราสามารถเข้าถึงตัวแปรภายนอกได้
$mx = ฟังก์ชั่น ($high_val) (
ฟังก์ชันส่งคืน ($val) ใช้ ($high_val) (
ส่งคืน $val > $high_val;
};
};
$i = อาร์เรย์(1, 2, 3, 4, 5, 6, 7);
$o = array_filter($input, $max_comp(2));
?>
ที่นี่เราอยู่ภายในของเรา ฟังก์ชันแลมบ์ดาใช้ตัวแปรโกลบอล สูง_วัล- เพื่อให้สิ่งนี้เป็นไปได้ เราต้องทำตามพระวจนะนั้น การทำงานและเขียนพารามิเตอร์ไว้ในวงเล็บ ใช้และส่งชื่อของตัวแปรภายนอกที่เราต้องการใช้ภายในโค้ดฟังก์ชันไปที่นั่น
อย่างไรก็ตาม เราจะไม่สามารถเปลี่ยนค่าของตัวแปรทั่วโลกด้วยวิธีนี้ได้ ในการดำเนินการนี้ คุณจะต้องระบุเครื่องหมายก่อนชื่อ &
$name = "ไบรอัน";
$setName = function($n) ใช้(&$name) (
$ชื่อ = $n;
};
$setName("เดวิด");
สะท้อน $ ชื่อ;
?>
บทสรุป
ดังนั้นวันนี้คุณได้เรียนรู้ ฟังก์ชั่นที่ไม่ระบุชื่อใน php คืออะไรและใช้งานอย่างไร- ขอให้โชคดี!