2017-10-29 3 views
1

PHP에서 익명 함수가 혼동 스럽다. 익명의 함수가 주로 맛이나 코딩 스타일의 문제로 사용되는지 알고 싶다.익명 함수의 PHP 사용

콜백 기능과 적은 코드없이 동일한 결과를 얻을 수 있기 때문에이 질문을드립니다.

$output = 10; 
$people = (new People(new John)); 

//VERSION 1 ANONYMOUS FUNCTION 
$people->run(function ($value) use(&$output){ 
    $output = $output + $value; 
}); 

var_dump($output); //RESULT => 20 

//VERSION 2 WITHOUT ANONYMOUS FUNCTION 
var_dump($people->run() + $output); //RESULT => 30 

당신은 실행하고 여기에 전체 코드를 볼 수 있습니다 : https://www.tehplayground.com/IhWJJU0jbNnzuird

<?php 

interface HumanInterface 
{ 
    public function hello(); 
} 

class People 
{ 
    protected $person; 
    protected $value; 

    public function __construct(HumanInterface $person) 
    { 
     $this->person = $person; 
     return $this; 
    } 

    public function run(callable $callback = null, $name = null) 
    { 
     $this->value = 10; 
     if(is_callable($callback)) { 
      return call_user_func($callback, $this->value); 
     } 

     return $this->value; 
    } 
} 

class John implements HumanInterface 
{ 
    public function hello() 
    { 
     return 'hi i am john'; 
    } 
} 
$output = 10; 
$people = (new People(new John)); 
$people->run(function ($value) use(&$output){ 
    $output = $output + $value; 
}); 

var_dump($output); 
var_dump($people->run() + $output); 

그래서 내 질문은 왜 사용 그래서 여기

는 몇 가지 테스트 코드 익명의 기능? 개인적인 문제입니까?

답변

1

익명 함수 또는 "Closure"는 일회성 콜백으로 사용되는 경우 매우 유용합니다. 예를 들어 PHP의 usort -method를 사용하는 경우. 두 번째 매개 변수는 Closure가 될 수 있습니다. 따라서 한 번 사용한 후 다시는 절대로 사용하지 않는 명명 된 함수를 작성하는 대신 Closure를 사용합니다. IMHO 이것은 Closures : 콜백을 사용하는 유일한 방법입니다.

1

익명 함수는 나중에 실행하거나 다른 코드 수락 함수로 전달할 때 유용합니다. 이를 사용하면 작업 수행에 필요한 코드를 크게 줄일 수 있습니다.

밑에 일반 콜렉션을 사용하는 UserCollection 개체가 있다고 가정 해보십시오. 특정 국가의 사용자 만 UserCollection으로 줄이려고합니다. 그래서 당신은 UserCollection에 방법 findByCountry()을 추가 할 수 있습니다

public function findByCountry($country) : UserCollection { 
    $subset = new UserCollection; 
    foreach ($this->users as $user) { 
     if ($user->country === $country) { 
      $subset->add($user); 
     } 
    } 
    return $subset; 
} 

이 모두 괜찮지 만, 추가 파인더 방법은 모두 같은 작업을 수행합니다 반복 만 기준이 다른 존재와 하위 집합으로 수집합니다. 너무 많은 상용구 코드.

당신은 쉽게 다음과 같이 기본 컬렉션 방법 find(callable $callback)를 추가하여 기준에서 상용구를 분리 할 수 ​​있습니다 :

public function find(callable $criteria) : Collection { 
    $subset = new Collection; 
    foreach ($this->users as $user) { 
     if ($criteria($user)) { 
      $subset->add($user); 
     } 
    } 
    return $subset; 
} 

이 일반적인 찾기입니다. 이제 UserCollection의 코드는 실제 기준이 포함됩니다 : 상용구에서 기준을 분리함으로써

public function findByCountry($country): UserCollection { 
    return $this->subset(function(User $user) { 
     return $user->country === $country; 
    }); 
} 

private function subset($criteria): UserCollection { 
    return new UserCollection($this->allUsers->find($criteria)); 
} 

을, 당신이 국가에 의해 사용자를 찾기 위해 노력하고 있는지 파악하는 것이 훨씬 쉽다. 실제 기준에서 벗어나는 반복 코드는 없습니다. 따라서 이해하기가 쉬워지고 작문하기가 쉽지 않습니다. 또한, 다른 곳에서 정의 되었기 때문에 우연히 반복을 엉망으로 만들 수 없습니다.

이와 같은 익명의 기능을 사용하면 전략 패턴이나 FilterIterator과 매우 유사합니다. 눈에 띄는 차이점은 당신이 날아 다니는 것입니다.

differentiate between Lambdas and Closures입니다. 나는 의도적으로이 대답의 차이점을 무시했다.

관련 문제