ฟังก์ชันนิรนามหรือแลมบ์ดาใน 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 คืออะไรและใช้งานอย่างไร- ขอให้โชคดี!



2024 wisemotors.ru. วิธีนี้ทำงานอย่างไร. เหล็ก. การทำเหมืองแร่ สกุลเงินดิจิทัล