익명 함수는 엄밀히 말하면 객체 지향 기능은 아니지만 콜백을 사용하는 객체 지향 애플리케이션에서 접할 수 있으므로 매우 유용합니다.
다음 두 클래스를 살펴보세요.
<?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('callback not callable'); } $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('callback not callable'); } $this->callbacks[] = $callback; } function process($product) { print "{$product->name}: processing\n"; foreach($this->callbacks as $callback) { call_user_func($callback, $product); } } } $logger = create_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 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!