PHP 콜백 및 익명 함수

怪我咯
풀어 주다: 2023-03-11 18:02:02
원래의
844명이 탐색했습니다.

익명 함수는 엄밀히 말하면 객체 지향 기능은 아니지만 콜백을 사용하는 객체 지향 애플리케이션에서 접할 수 있으므로 매우 유용합니다.

다음 두 클래스를 살펴보세요.

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

?>
로그인 후 복사

이 코드의 목적은 다양한 콜백을 실행하는 것입니다. 제품은 $name 및 $price만 저장합니다. Processsale은 2개의 메소드로 구성됩니다. Registercallback()은 자동 스칼라를 승인하고 스칼라를 테스트한 후 콜백 배열에 추가합니다. 테스트 함수를 구현하는 내장 함수is_callable() 함수는 전달된 값이 call_user_func() 또는 array_walk()와 같은 함수에 의해 호출되도록 보장합니다.

process() 메소드는 제품 객체를 받아들이고 객체와 관련된 정보를 출력합니다. 그런 다음 $callbacks 배열 속성을 반복합니다.

콜백의 장점: 콜백을 사용하면 구성 요소의 핵심 작업과 직접적인 관련이 없는 기능을 런타임 시 구성 요소에 삽입할 수 있습니다. 구성 요소 콜백을 사용하면 자신이 모르는 컨텍스트에서 코드를 확장할 수 있는 기능을 다른 사람에게 제공할 수 있습니다.

이제 사용자가 판매 기록을 생성하려고 한다고 가정해 보겠습니다. 해당 사용자가 클래스에 직접 액세스할 수 있는 경우 process() 메서드에 로깅 논리를 추가할 수 있지만 때로는 이것이 나쁜 습관입니다. 만약 그가 클래스의 관리자가 아니라면, 그의 클래스 변경 사항은 다음 업데이트에서 덮어쓰여질 것입니다. 비록 그가 이 구성 요소의 관리자라고 하더라도 process() 메서드에 너무 많은 추가 작업을 추가하는 것은 카트를 말 앞에 두는 것이며 이 메서드의 핵심 기능을 반영하지 못하는 것이며, 이로 인해 이 메서드가 프로젝트를 교차할 가능성이 줄어들 수 있습니다.

다행히 프로세스 콜백을 만들었습니다.

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

$logger = create_function(&#39;$product&#39;, &#39;print " logging ({$product->name})\n";&#39;);
$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));
?>
로그인 후 복사

결과는 저절로 나옵니다.

          PHP 5.3 이상 버전은 익명 함수를 구현하는 더 나은 방법을 제공합니다.

$logger = function($product)
{
     print " logging ({$product->name})\n";
};

$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));
로그인 후 복사

이 메서드는 함수 키워드 인라인을 사용하며 함수 이름이 없습니다. 이는 인라인 문이므로 코드 블록 끝에 세미콜론이 필요합니다.

콜백은 익명일 필요는 없으며 함수 이름(또는 객체 참조 및 메서드)을 콜백으로 사용할 수 있습니다.

위 내용은 PHP 콜백 및 익명 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!