>백엔드 개발 >PHP 튜토리얼 >PHP+Swoole에서 클로저를 작성하는 방법

PHP+Swoole에서 클로저를 작성하는 방법

angryTom
angryTom앞으로
2019-10-15 09:26:102480검색

JS 프로그래머들은 항상 PHP에 클로저가 없다고 비웃습니다. 오늘은 PHP에 클로저를 구체적으로 소개하는 글을 작성하는 시간을 가졌습니다. PHP는 버전 5.3부터 익명 함수에 대한 지원을 추가했습니다. 현재 PHP5.6 및 PHP7에 대한 여러 버전과 반복을 거쳐 PHP 언어의 폐쇄가 매우 완벽해졌습니다. Swoole에서 제공하는 이벤트 기반 지원과 결합된 PHP의 클로저 기능은 매우 강력하고 우아합니다.

익명 함수


익명 함수는 클로저의 핵심입니다. PHP의 익명 함수는 실제로 Closure 클래스의 객체입니다(객체라는 점에 유의하세요). 일반적인 객체 지향 프로그래밍과 달리 익명 함수의 코드는 호출 지점에서 직접 작성되며, 추가 클래스를 작성하거나 메서드의 코드를 작성할 필요가 없습니다. 이것의 장점은 더 직접적이라는 것입니다. 다음 예에서는 2초마다 hello world를 출력하도록 타이머를 설정합니다.

전통적인 쓰기 방법

function timer () {
    echo "hello world";
}
Swoole\Timer::tick(2000, 'timer');

닫힌 쓰기 방법

Swoole\Timer::tick(2000, function () {
    echo "hello world";
});

전통적인 쓰기 방법인 비클로저, 먼저 함수를 선언한 후 함수 이름 문자열을 전송합니다. 두 코드 조각은 분리되어 있어 충분히 직관적이지 않습니다. 클로저 메소드는 타이머의 선언과 타이머가 실행할 코드를 함께 작성하는데, 로직이 매우 명확하고 직관적입니다. 클로저 구문을 사용하면 콜백 함수를 쉽게 작성할 수 있습니다. 사용자가 실행 코드를 전달해야 하는 이벤트 중심 프로그래밍, 정렬, array_walk 등과 같은 시나리오에서는 클로저가 매우 우아하게 작성됩니다.

클로저의 가장 강력한 점은 호출 현장에서 외부 변수를 직접 도입할 수 있다는 점입니다. PHP에서 구현된 메소드는 use 키워드입니다.

구문 사용


타이머가 지금 변수를 전달해야 한다면 전통적인 쓰기 방법은 전역 변수를 통해서만 달성할 수 있습니다. JS와 달리 PHP의 변수 도입은 명시적입니다. 외부 변수를 참조하려면 use를 사용하여 선언해야 합니다. JS는 암시적이며 선언 없이 익명 함수 내에서 외부 변수를 자유롭게 조작할 수 있습니다. 이 방법의 장점은 코드를 적게 작성한다는 것이지만 단점은 위험하고 혼란스럽다는 것입니다.

전통적인 쓰기 방법

$str = "hello world";
function timer () {
    global $str;
    echo $str;
}
Swoole\Timer::tick(2000, 'timer');

닫힌 쓰기 방법

$str = "hello world";
Swoole\Timer::tick(2000, function () use ($str) {
    echo $str;
});

닫기 쓰기 방법은 전역 전역 변수를 사용하지 않고 현재 $str 변수를 직접 도입하기 위해 use를 사용합니다. 또한 Swoole의 이벤트 기반 프로그래밍 모드에 있는 경우 전역 전역 변수가 하나만 있기 때문에 전역을 사용하여 비동기 동시성을 달성할 수 없습니다. 동시에 여러 클라이언트 요청이 있는 경우 각 요청은 데이터베이스를 쿼리해야 합니다. 기존의 프로그래밍 방식은 구현하기 쉽지 않으며, 클라이언트의 ID를 KEY로 해당 데이터를 저장하려면 전역 변수 배열을 사용해야 합니다.

기존 쓰기 방법

$requestArray = array();
$dbResultArray = array();
function my_request($request, $response) {
    global $dbResultArray, $requestArray;
    $queryId = $db->query($sql, 'get_result');
    $requestArray[$request->fd] = array($request, $response);
    $dbResultArray[$queryId] = $request->fd;
}
function get_result($queryId, $queryResult) {
    global $dbResultArray, $requestArray;
    list($request, $response) = $requestArray[$dbResultArray[$queryId]];
    $response->end($queryResult);
}
$server->on('request', 'my_request');

클로저 쓰기 방법

$server->on('request', function ($request, $response) {
    $queryId = $db->query($sql, function ($queryId, $queryResult) use ($request, $response) {
        $response->end($queryResult);
    });
});

기존 쓰기 방법은 매우 복잡하고 전역 배열에서 데이터를 여러 번 저장/추출해야 합니다. 클로저 작성 방법은 매우 간결하고 우아하며, 동일한 기능을 달성하려면 코드 몇 줄만 있으면 됩니다. 클로저 쓰기는 비동기 비차단 콜백 모드에서 서버 프로그램을 작성하는 데 매우 적합합니다. 현재 널리 사용되는 프로그래밍 언어 중 PHP와 JS에만 이 기능이 있습니다.

클로저의 추가 기능


클래스 메서드에서 익명 함수를 사용합니다. 버전 5.4 이상에서는 $this를 도입하기 위해 use를 사용할 필요가 없습니다. 익명 함수에서 $this를 직접 사용하여 현재 개체의 메서드를 호출할 수 있습니다. Swoole 프로그래밍에서 이 기능을 사용하면 $serv 개체의 사용 소개 및 전달을 줄일 수 있습니다.

class Server extends Swoole\Server {
    function onReceive($serv, $fd, $reactorId, $data) {
        $db->query($sql, function ($queryId, $queryResult) use ($fd) {
            $this->send($fd, $queryResult);
        }
    }
}

또한 클로저 함수에서 외부 변수를 수정하고 싶다면 사용시 변수에 & 참조 기호를 추가하면 됩니다. PHP에서는 객체가 기본적으로 값이 아닌 참조로 전달되기 때문에 객체 유형을 추가할 필요가 없습니다.

더 많은 PHP 관련 지식을 알고 싶다면 PHP 중국어 웹사이트를 방문하세요!

위 내용은 PHP+Swoole에서 클로저를 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 rango.swoole.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제