0Pricing
PHP Academy · บทเรียน

ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์

เขียนฟังก์ชันในบรรทัดและจับตัวแปรด้วย use

ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์ เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชันไม่ระบุชื่อคืออะไร

ฟังก์ชันไม่ระบุชื่อ (แลมบ์ดา) คือฟังก์ชันที่ไม่มีชื่อ ใน PHP ฟังก์ชันนี้เป็นอินสแตนซ์ของคลาส Closure ในตัว และสามารถเก็บไว้ในตัวแปร ส่งเป็นอาร์กิวเมนต์ หรือส่งกลับจากฟังก์ชันอื่นได้

ฟังก์ชันไม่ระบุชื่อพื้นฐาน

กำหนดฟังก์ชันให้กับตัวแปรแล้วเรียกใช้:

<?php
$double = function(int $n): int {
    return $n * 2;
};

echo $double(5);   // 10
echo $double(21);  // 42

การส่งฟังก์ชันไม่ระบุชื่อ

ส่งคลอเชอร์เป็นอาร์กิวเมนต์ให้ฟังก์ชันอย่าง array_map, usort หรือฟังก์ชันเรียกกลับของคุณเอง:

<?php
$nums = [3, 1, 4, 1, 5, 9];

$squared = array_map(function(int $n): int {
    return $n ** 2;
}, $nums);

print_r($squared); // [9, 1, 16, 1, 25, 81]

การส่งกลับฟังก์ชัน

ฟังก์ชันสามารถสร้างและส่งกลับคลอเชอร์ได้ — นี่คือรูปแบบโรงงาน:

<?php
function makeMultiplier(int $factor): Closure {
    return function(int $n) use ($factor): int {
        return $n * $factor;
    };
}

$triple  = makeMultiplier(3);
$tenX    = makeMultiplier(10);

echo $triple(5);   // 15
echo $tenX(5);     // 50

คลอเชอร์และ use

คลอเชอร์สามารถจับตัวแปรจากขอบเขตภายนอกด้วย use ได้ การจับจะใช้ค่า (สำเนา) เว้นแต่คุณจะเพิ่ม &:

<?php
$taxRate = 0.18;

$addTax = function(float $price) use ($taxRate): float {
    return $price * (1 + $taxRate);
};

$taxRate = 0.20;  // change outer variable
echo $addTax(100); // 118 — captured value at creation time

การจับตัวแปรด้วยการอ้างอิงด้วย use(&)

หากต้องการให้คลอเชอร์เห็นค่าภายนอกที่อัปเดตแล้ว ให้จับตัวแปรด้วยการอ้างอิง:

<?php
$count = 0;

$increment = function() use (&$count): void {
    $count++;
};

$increment();
$increment();
echo $count;  // 2

ฟังก์ชันลูกศร (PHP 7.4)

ฟังก์ชันลูกศรคือคลอเชอร์แบบนิพจน์เดียวที่กระชับ และจะจับขอบเขตภายนอกด้วยค่าโดยอัตโนมัติ:

<?php
$rate = 1.18;
$prices = [10, 20, 30];

// Arrow function — no 'use' needed
$withTax = array_map(fn($p) => $p * $rate, $prices);

print_r($withTax); // [11.8, 23.6, 35.4]

ฟังก์ชันลูกศรแก้ไขขอบเขตภายนอกไม่ได้

ฟังก์ชันลูกศรจับตัวแปรด้วยค่าเท่านั้น — จึงไม่สามารถแก้ไขตัวแปรภายนอกได้:

<?php
$total = 0;
$nums  = [1, 2, 3];

// This does NOT modify $total!
array_walk($nums, fn($n) => $total += $n);

echo $total;  // 0

// Use a reference closure for mutation:
array_walk($nums, function($n) use (&$total) { $total += $n; });
echo $total;  // 6

คลอเชอร์ในฐานะฟังก์ชันเรียกกลับ

ฟังก์ชัน PHP จำนวนมากรับสิ่งที่เรียกได้ — คุณสามารถส่งคลอเชอร์ อาร์เรย์ [$obj, 'method'] หรือชื่อฟังก์ชันในรูปสตริงได้:

<?php
$words = ['banana', 'apple', 'cherry'];

usort($words, fn($a, $b) => strcmp($a, $b));

print_r($words); // ['apple', 'banana', 'cherry']

คลอเชอร์ที่เรียกใช้ทันที

คุณสามารถกำหนดและเรียกคลอเชอร์ในบรรทัดเดียวกันได้ — มีประโยชน์สำหรับสร้างขอบเขตที่แยกออกมา:

<?php
$result = (function(): int {
    $x = 10;
    $y = 20;
    return $x + $y;
})();

echo $result; // 30
// $x and $y are not in outer scope

Closure::bind และ bindTo

คุณสามารถผูกคลอเชอร์ใหม่กับบริบทของอ็อบเจกต์อื่นได้โดยใช้ Closure::bind():

<?php
class Counter {
    private int $value = 0;
}

$increment = Closure::bind(function(int $by): void {
    $this->value += $by;
}, new Counter(), Counter::class);

// Now $increment has access to private $value

ตรวจสอบความเข้าใจ

ข้อใดต่อไปนี้คือความแตกต่างหลักระหว่างคลอเชอร์ทั่วไปที่ใช้ use กับฟังก์ชันลูกศรใน PHP

ทบทวน: ฟังก์ชันไม่ระบุชื่อและคลอเชอร์

สรุป:

  • ฟังก์ชันไม่ระบุชื่อเก็บไว้ในตัวแปรและส่งต่อได้
  • คลอเชอร์จับตัวแปรภายนอกด้วย use($var) (ด้วยค่า) หรือ use(&$var) (ด้วยการอ้างอิง)
  • ฟังก์ชันลูกศร (PHP 7.4) จะจับขอบเขตภายนอกด้วยค่าโดยอัตโนมัติ
  • มีประโยชน์สำหรับฟังก์ชันเรียกกลับ: array_map, usort, array_filter…
  • สามารถส่งกลับจากฟังก์ชันโรงงานได้

คำถามที่พบบ่อย

บทเรียน “ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์”

เขียนฟังก์ชันในบรรทัดและจับตัวแปรด้วย use คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดและเรียกใช้ฟังก์ชัน
  2. พารามิเตอร์ค่าเริ่มต้นและพารามิเตอร์จำนวนไม่แน่นอน
  3. ขอบเขตตัวแปร: ภายในและส่วนกลาง
  4. ฟังก์ชันไม่ระบุชื่อและโคลสเชอร์
← กลับไปที่ PHP Academy