PHP에서 Array_Filter () 는 우리가 전달한 콜백 함수를 기반으로 배열을 필터링 할 수있는 매우 강력한 기능입니다. 그러나 여러 장소에서 유사한 필터링 로직이 사용되는 대규모 프로젝트 또는 시나리오에서는 각 콜 포인트에서 익명 기능을 직접 작성하는 것이 재사용 및 유지 보수를 코딩하는 데 도움이되지 않습니다. 이 기사에서는 Code 의 필터링 로직을 재사용 가능한 구성 요소로 캡슐화하여 코드를보다 우아하고 유지 관리 할 수 있도록하는 방법을 소개합니다.
먼저 가장 기본적인 사용법을 살펴 보겠습니다.
$data = [1, 2, 3, 4, 5];
// 짝수를 걸러냅니다
$filtered = array_filter($data, function($item) {
return $item % 2 === 0;
});
print_r($filtered);
위의 코드는 간단하지만 여러 장소에서 "짝수 숫자"의 논리가 필요한 경우 코드 복제 문제에 직면하게됩니다.
일반적으로 사용되는 필터링 로직을 클래스로 캡슐화하고 통합 인터페이스를 통해 호출하여 재사용 가능성을 달성 할 수 있습니다.
class ArrayFilter
{
protected array $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function filter(callable $callback): array
{
return array_filter($this->data, $callback);
}
}
사용 방법 :
$data = [1, 2, 3, 4, 5];
$filter = new ArrayFilter($data);
$result = $filter->filter(function ($item) {
return $item % 2 === 0;
});
print_r($result);
논리를 추가로 해체하기 위해 필터 조건을 "전략 클래스"로 캡슐화 할 수 있습니다.
interface FilterStrategyInterface
{
public function apply($item): bool;
}
class EvenNumberFilter implements FilterStrategyInterface
{
public function apply($item): bool
{
return $item % 2 === 0;
}
}
그런 다음이 정책을 수신하려면 ArrayFilter 클래스를 수정하십시오.
class StrategyArrayFilter
{
protected array $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function filter(FilterStrategyInterface $strategy): array
{
return array_filter($this->data, [$strategy, 'apply']);
}
}
사용 방법 :
$data = [1, 2, 3, 4, 5];
$filter = new StrategyArrayFilter($data);
$result = $filter->filter(new EvenNumberFilter());
print_r($result);
이러한 방식으로, 각 필터링 로직은 클래스로 별도로 정의 될 수 있으며, 쉬운 테스트 및 재사용을위한 우수한 코드 구성 구조를 구현할 수 있습니다.
필터를보다 유연하게 구성하려면 (예 : 구성 파일을 기반으로 정책 선택) "공장 클래스"또는 "서비스 등록 메커니즘"을 추가 할 수 있습니다. 간단한 서비스 등록 예는 다음과 같습니다.
class FilterFactory
{
public static function create(string $type): FilterStrategyInterface
{
return match ($type) {
'even' => new EvenNumberFilter(),
default => throw new InvalidArgumentException("Unknown filter type: $type")
};
}
}
사용법은 다음과 같습니다.
$filterType = 'even'; // 구성 또는 사용자 입력에서 가정합니다
$strategy = FilterFactory::create($filterType);
$filter = new StrategyArrayFilter([1, 2, 3, 4, 5]);
$result = $filter->filter($strategy);
print_r($result);
Array_Filter () 의 콜백 함수를 클래스로 캡슐화함으로써 더 명확하고 쉽게 테스트하고 테스트하고 유지 관리 할 수 있습니다. 이 전략 패턴은 특히 대규모 응용 프로그램에서 복잡하거나 가변 필터링 로직을 처리하는 데 매우 적합합니다.