PHPμ—μ„œ 읡λͺ… ν•¨μˆ˜λŠ” 이름이 μ—†λŠ” ν•¨μˆ˜λ‘œ, λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜ λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 전달할 수 μžˆλŠ” νŠΉλ³„ν•œ ν˜•νƒœμ˜ ν•¨μˆ˜λ‹€. 특히 β€˜use’ ν‚€μ›Œλ“œλŠ” 읡λͺ… ν•¨μˆ˜μ—μ„œ 맀우 μ€‘μš”ν•œ 역할을 ν•˜λŠ”λ°, 이에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄λ„λ‘ ν–ˆλ‹€.

읡λͺ… ν•¨μˆ˜λž€?

읡λͺ… ν•¨μˆ˜λŠ” ν•¨μˆ˜μ˜ 이름 없이 μ •μ˜λ˜λŠ” ν•¨μˆ˜λ‘œ, ν΄λ‘œμ €(Closure)라고도 λΆˆλ¦°λ‹€. 주둜 콜백으둜 μ‚¬μš©λ˜κ±°λ‚˜ λ³€μˆ˜μ— μ €μž₯돼 λ‚˜μ€‘μ— μ‹€ν–‰ν•  수 μžˆλ‹€.

κΈ°λ³Έ 문법

$ν•¨μˆ˜λͺ… = function(λ§€κ°œλ³€μˆ˜) use (μ™ΈλΆ€λ³€μˆ˜) {
    // ν•¨μˆ˜ λ‚΄μš©
};

λ™μž‘ 방식

flowchart LR
    A[클래슀 μ •μ˜] --> B[객체 생성]
    B --> C[λ©”λͺ¨λ¦¬ 적재]
    C --> D[μ¦‰μ‹œ μ‚¬μš©]
    D --> E[μ†Œλ©Έ]

use ν‚€μ›Œλ“œκ°€ ν•„μš”ν•œ 이유

1. μŠ€μ½”ν”„ 문제

PHP의 읡λͺ… ν•¨μˆ˜λŠ” 기본적으둜 μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†λ‹€. μ΄λŠ” λ³€μˆ˜ μŠ€μ½”ν”„μ˜ μ œν•œ λ•Œλ¬Έμ΄λ‹€.

$message = "μ•ˆλ…•ν•˜μ„Έμš”";
 
// 였λ₯˜ λ°œμƒ
$greet = function() {
    echo $message;  // Undefined variable $message
};
 
// 정상 λ™μž‘
$greet = function() use ($message) {
    echo $message;  // "μ•ˆλ…•ν•˜μ„Έμš”" 좜λ ₯
};

2. λ³€μˆ˜ 캑처

use ν‚€μ›Œλ“œλŠ” μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό ν•¨μˆ˜ λ‚΄λΆ€λ‘œ κ°€μ Έμ˜€λŠ” 역할을 ν•œλ‹€.

$multiplier = 3;
$numbers = [1, 2, 3, 4, 5];
 
$result = array_map(function($n) use ($multiplier) {
    return $n * $multiplier;
}, $numbers);
// κ²°κ³Ό: [3, 6, 9, 12, 15]

use ν‚€μ›Œλ“œ μ‚¬μš© 방법

1. μ—¬λŸ¬ λ³€μˆ˜ μΊ‘μ²˜ν•˜κΈ°

$firstName = "길동";
$lastName = "홍";
 
$fullName = function() use ($firstName, $lastName) {
    return $lastName . $firstName;
};

2. 참쑰둜 λ³€μˆ˜ μΊ‘μ²˜ν•˜κΈ°

$counter = 0;
 
$increment = function() use (&$counter) {
    $counter++;
};
 
$increment();  // $counterλŠ” 1이 λœλ‹€
$increment();  // $counterλŠ” 2κ°€ λœλ‹€

μ£Όμš” νŠΉμ§•

1. κ°’ 볡사

use둜 μΊ‘μ²˜ν•œ λ³€μˆ˜λŠ” 기본적으둜 값이 λ³΅μ‚¬λœλ‹€.

$message = "원본";
$printer = function() use ($message) {
    echo $message;
};
 
$message = "변경됨";
$printer();  // "원본" 좜λ ₯

2. μ°Έμ‘° 전달

참쑰둜 μ „λ‹¬ν•˜λ©΄ 원본 λ³€μˆ˜μ˜ 변경사항이 λ°˜μ˜λœλ‹€.

$message = "원본";
$printer = function() use (&$message) {
    echo $message;
};
 
$message = "변경됨";
$printer();  // "변경됨" 좜λ ₯

μ‹€μ œ μ‚¬μš© μ˜ˆμ‹œ

1. 이벀트 ν•Έλ“€λŸ¬

$config = ['debug' => true];
 
$errorHandler = function($error) use ($config) {
    if ($config['debug']) {
        echo "였λ₯˜ λ°œμƒ: " . $error;
    }
};

2. 데이터 필터링

$allowedTypes = ['jpg', 'png', 'gif'];
 
$fileFilter = function($file) use ($allowedTypes) {
    return in_array($file['extension'], $allowedTypes);
};

μ£Όμ˜μ‚¬ν•­

  1. use ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜ μ •μ˜ μ‹œμ μ˜ λ³€μˆ˜ 값을 μΊ‘μ²˜ν•œλ‹€
  2. λ„ˆλ¬΄ λ§Žμ€ λ³€μˆ˜λ₯Ό μΊ‘μ²˜ν•˜λ©΄ μ½”λ“œμ˜ λ³΅μž‘λ„κ°€ μ¦κ°€ν•œλ‹€
  3. μ°Έμ‘° 전달은 μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€

use ν‚€μ›Œλ“œμ˜ μž₯점

  1. μ™ΈλΆ€ λ³€μˆ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄ μ½”λ“œμ˜ 가독성이 ν–₯상됐닀
  2. λ³€μˆ˜μ˜ μŠ€μ½”ν”„λ₯Ό λͺ…ν™•ν•˜κ²Œ μ œμ–΄ν•  수 μžˆλ‹€
  3. ν΄λ‘œμ €μ˜ λ™μž‘μ„ 예츑 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“ λ‹€

κ²°λ‘ 

읡λͺ… ν•¨μˆ˜μ—μ„œ use ν‚€μ›Œλ“œλŠ” μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ ν•„μˆ˜μ μΈ μš”μ†Œλ‹€. 이λ₯Ό 톡해 ν΄λ‘œμ €μ˜ λ™μž‘μ„ 더 잘 μ œμ–΄ν•  수 있으며, μ½”λ“œμ˜ μ•ˆμ •μ„±κ³Ό 가독성을 높일 수 μžˆλ‹€. λ‹€λ§Œ, κ³Όλ„ν•œ μ‚¬μš©μ€ μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ μ¦κ°€μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ μ ˆν•œ μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. 특히 μ°Έμ‘° 전달을 μ‚¬μš©ν•  λ•ŒλŠ” side effectλ₯Ό κ³ λ €ν•΄ μ‹ μ€‘ν•˜κ²Œ κ²°μ •ν•΄μ•Ό ν•œλ‹€.