댓글 검색 목록

[php] PHP 콜백 함수 – 종합 초보자 안내서

페이지 정보

작성자 운영자 작성일 20-04-18 17:03 조회 1,030 댓글 0

신비한 함수 


PHP 콜백 함수에 대한 초보자 튜토리얼에 오신 것을 환영합니다. 함수는 PHP (및 다른 객체 지향 프로그래밍 언어)에서 알아야 할 가장 기본적인 것 중 하나입니다. 일부 코드 사용자들은 아마도 기능이 간단하다고 생각할 것입니다. 그리고 소매에는“숨겨진 속임수”가 없습니다…


고급 프로젝트에서 작업하거나 고급 자습서를 읽고 사람들이 함수에 함수를 넣을 때 이 그늘진 기법을 찾을 때까지. 그렇습니다. 함수 내 함수는 콜백으로 알려져 있으며, 세상에서 이 그늘진 사악한 개발자들은 무엇을 생각하고 있습니까? 왜 콜백 함수가 있습니까? 우리는 어떤 용도로 사용하며 어떻게“평범한”것과 다른가? 알아 보려면 계속 읽으십시오!


ⓘ이 튜토리얼의 시작 부분에 모든 예제 코드가 포함 된 zip 파일이 포함되어 있으므로 모든 것을 복사하여 붙여 넣을 필요가 없습니다.


예제 코드 다운로드 


먼저 약속 된 예제 소스 코드에 대한 다운로드 링크가 있습니다.


소스 코드 다운로드 


소스 코드를 다운로드하려면 여기를 클릭하십시오. MIT 라이센스에 따라 릴리스되었으므로 그 위에 빌드하거나 자신의 프로젝트에서 자유롭게 사용하십시오.


빠른 시작 


  • 폴더에 다운로드하여 압축을 풉니다.
  • 데이터베이스를 작성하고 1a-users.sql을 가져 오십시오.
  • 1b-config.php의 데이터베이스 설정을 원하는 대로 변경하십시오.
  • 아래 튜토리얼을 따르십시오.

기본 


코드 예제를 시작하기 전에 몇 가지 기본 사항을 설명하고 더 잘 이해할 수 있도록 도와 드리겠습니다. 콜백 함수란 무엇입니까? 무엇을 하며 왜 사용해야 합니까?


콜백 기능이란 무엇입니까? 


콜백 함수는 인수로 다른 함수에 전달 된 함수로, 외부 함수 내에서 호출되어 일종의 루틴 또는 조치를 완료합니다.


모질라와 다른 괴짜 웹 사이트들도 비슷한 정의를 하고 있습니다. 하지만 그게 무슨 뜻입니까? 어쩌면 예가 이것을 더 잘 설명 할 것입니다. 데이터베이스에서 사용자 정보를 검색하는 "공통 Joe 기능"이 있다고 가정 해 봅시다.


php-callback-a.jpg 


일반적으로 순차적 인 방식으로 수행하는 것은 사용자 가져 오기 기능의 출력을 사용하여 HTML 테이블에 표시하는 것입니다.


php-callback-b.jpg 


그것에 아무런 문제가 없지만, 결과를 HTML 테이블로 직접 형식화 하는 get user 함수에 함수를 전달하는 미친 일을 하면 어떻게 될까요?


php-callback-c1.jpg 


이제 이 수정으로 get user 함수는 처음에 출력 HTML 함수를 호출합니다. 이것이 콜백 함수라고 하는 이유입니다.


콜백 기능을 사용하는 이유는 무엇입니까? 


당신 중 일부는 혐오 불꽃 코드 사용자를 트롤이 바보라고 생각해야 합니다. 왜 모든 원형 교차로가 함수에 함수를 전달합니까? 혼란을 가중 시키는 것 외에는 어떤 목적이 있습니까?


생성 된 HTML 테이블이 둘 이상의 페이지에서 사용되는 상황을 고려하십시오. 관리자 패널의 "내 계정"과 "사용자 편집"둘 다일 수 있습니다. 이제 말이 되나요? 가능한 많은 장소에서 사용되는 HTML 형식을 지정하는 하나의 함수.


콜백 함수 사용의 또 다른 장점은 우려의 분리입니다. 이를 통해 get user를 유지하고 HTML을 개별적으로 변환 할 수 있습니다. 이는 또한 시스템 확장의 편의성을 높여줍니다. 사용자 데이터를 JSON 형식으로 출력하려면 다른 변환 JSON 콜백 함수 만 작성하면 됩니다.


이것은 HOOK이 아닌가? 


콜백과 훅은 실제로 두 가지입니다.

  • 위에서 설명한 콜백은 다른 함수에 전달하는 함수입니다.
  • 반면 후크는 인터셉터입니다. 정상적인 함수 흐름을 방해하고 작동 방식을 변경할 수 있습니다.

따라서 예, 콜백에 의해 출력이 변경되므로 위의 예는 콜백 함수와 후크라는 것을 개인적으로 말할 것입니다. 그러나 일부 고급 코드 사용자는 아마도 동의하지 않을 것이며 아마도 후크가 아니라고 말할 것입니다. 그들도 틀리지 않습니다. 소금 한 덩어리로 이것을 가져 가면 스스로 결정합니다.


사용자 콜백예 받기 


콜백 함수의 기본 사항을 알았으므로 위의 사용자 가져 오기 예제의 실제 PHP 및 MySQL 코드로 이동하십시오.


데이터베이스 


CREATE TABLE `users` ( `user_id` int(11) NOT NULL, `user_name` varchar(255) NOT NULL, `user_email` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `users` (`user_id`, `user_name`, `user_email`) VALUES (1, 'John Doe', 'john@doe.com'), (2, 'Jane Doe', 'jane@doe.com'), (3, 'Josh Doe', 'josh@doe.com'), (4, 'Joy Doe', 'joy@doe.com'), (5, 'Jasmine Doe', 'jasmine@doe'), (6, 'Jake Doe', 'jake@doe.com'), (7, 'Johan Doe', 'johan@doe.com'); ALTER TABLE `users` ADD PRIMARY KEY (`user_id`), ADD UNIQUE KEY `user_email` (`user_email`), ADD KEY `user_name` (`user_name`); ALTER TABLE `users` MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; COMMIT; 


더미 사용자 테이블을 만드는 것으로 시작하겠습니다.이 필드는 3 개의 필드 만 있는 매우 간단한 테이블입니다.


FieldDescription
user_idUser ID. Primary key, auto-increment.
user_emailThe user email, unique field.
user_nameThe user’s name.

구성 파일 



<?php // MUTE NOTICES error_reporting(E_ALL & ~E_NOTICE); // DATABASE SETTINGS - CHANGE THESE TO YOUR OWN define('DB_HOST', 'localhost'); define('DB_NAME', 'test'); define('DB_CHARSET', 'utf8'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); ?> 



다음으로, 모든 설정을 넣을 수있는 설정 파일을 만듭니다. 데이터베이스 설정을 원하는 대로 변경하십시오.


사용자 함수 얻기 


<?php function getUser ($id, $callback=null) { // getUser() : get user by ID // PARAM $id : user ID // $callback : callback function, if any // CONNECT TO DATABASE SERVER try { $str = "mysql:host=" . DB_HOST . ";charset=" . DB_CHARSET; if (defined('DB_NAME')) { $str .= ";dbname=" . DB_NAME; } $pdo = new PDO( $str, DB_USER, DB_PASSWORD, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } // ERROR - THROW ERROR MESSAGE catch (Exception $ex) { print_r($ex); die(); } // GET USER $stmt = $pdo->prepare("SELECT * FROM `users` WHERE `user_id`=?"); $stmt->execute([$id]); $user = $stmt->fetchAll(); $user = count($user)==0 ? false : $user[0] ; // CALLBACK if (is_callable($callback)) { $user = $callback($user); } // RETURN RESULT return $user; } 


데이터베이스에서 사용자 데이터를 가져 오는 함수입니다. 또한 최상위 함수이라고도 하며 외부 함수을 선호하는 사람도 있습니다.


CALLBACK FUNCTIONS 


<?php function toHTML ($user) { // toHTML() : format user data array to HTML // PARAM $user : user data // Format HTML $html = "<table>"; if (is_array($user)) { foreach ($user as $k=>$v) { $html .= "<tr><td>$k</td><td>$v</td></tr>"; } } else { $html .= "<tr><td>Invalid User</td></tr>"; } $html .= "</table>"; return $html; } function toJSON ($user) { // toJSON() : format user data array to JSON // PARAM $user : user data return json_encode($user); } 


이것들은 일반적인 배열을 HTML과 JSON으로 변환하는 "매직 함수"입니다. 이미 짐작 했듯이 일부 사람들은 콜백 함수를 최하위 함수 또는 내부 함수라고 합니다.


그들과 함께 조각 


<?php // INIT require "1b-config.php"; require "1c-get-user.php"; require "1d-callback.php"; $userID = 3; // User ID to get // GET USER - RAW ARRAY $user = getUser($userID); echo "RAW ARRAY, NO CALLBACK -<br>"; print_r($user); echo "<br><br>"; // GET USER - HTML $user = getUser($userID, "toHTML"); echo "HTML CALLBACK -<br>"; echo $user; echo "<br><br>"; // GET USER - JSON $user = getUser($userID, "toJSON"); echo "JSON CALLBACK -<br>"; echo $user; echo "<br><br>"; 


마지막으로 조각을 모아서 잘 돌아가는 것을 지켜봐야 합니다.


더 많은 예 


더 준비가 되셨습니까? 콜백 함수는 실제로 위의 예보다 훨씬 더 많습니다. 다음은 유용한 콜백 요가입니다.


익명 함수


<?php // INIT require "1b-config.php"; require "1c-get-user.php"; $userID = 2; // User ID to get // ANON FUNCTION $user = getUser($userID, function($user){ return "Hello, my name is " . $user['user_name'] . "."; }); echo $user; 


우리는 함수를 getUser에 직접 전달하고 있습니까? 이 이름 없는 함수는 익명 함수라고도 합니다. 이것은 우리가 많은 글로벌 기능으로 프로젝트를 복잡하게 하고 싶지 않을 때 일반적으로 하는 일입니다.이 익명의 "일회용"기능은 "사용자 종료"처리가 끝나는 순간 소멸되고 가비지가 수집됩니다.


더 많은 익명의 재미 


<?php // INIT require "1b-config.php"; require "1c-get-user.php"; $userID = 2; // User ID to get // ANON FUNCTION ARRAY $aarray = [ function ($user) { return "FIRST! " . $user['user_name'] . "<br>"; }, function ($user) { return "SECOND! " . $user['user_name'] . "<br>"; }, function ($user) { return "THIRD! " . $user['user_name'] . "<br>"; } ]; // FUNCTION LOOP foreach ($aarray as $fn) { $user = getUser($userID, $fn); echo $user; } 


일련의 익명 함수를 배열로 정의 할 수 있습니다. 실행할 일련의 프로세스가 있는 경우에 유용합니다.


배열 맵 트릭 


마지막 예제로 PHP의 "array_map"함수는 실제로 콜백 함수를 사용하는 하나의 기본 함수입니다. 지정된 함수를 지정된 배열에 적용합니다.


<?php function square($n) { return($n * $n); } $numbers = [1, 2, 3, 4, 5]; // array_map (callback, array, array, ...) $squared = array_map("square", $numbers); // [1, 4, 9, 16, 25] print_r($squared); 


다음은 배열 맵을 사용하는 약간 더 실용적인 예입니다. 여기서 사용자 ID 배열의 JSON 인코딩 데이터를 얻습니다.


<?php // INIT require "1b-config.php"; require "1c-get-user.php"; require "1d-callback.php"; // USERS TO GET $users = [1, 2, 3, 4, 5]; // ARRAY MAP // Callback function in a callback function // Call-ception... or func-ception? $json = array_map(function($userID){ return getUser($userID, "toJSON"); }, $users); // RESULT print_r($json); 


그러나 콜백 함수는 처음에는 다소 혼란 스러울 수 있습니다. 그러나 일단 당신이 아이디어를 지나면, 그들은 실제로 엉망이 되는 것이 꽤 재미 있습니다. ?


유용한 비트 


이것으로 코드가 완성되었으며 여기에 도움이 될만한 몇 가지 추가 기능이 있습니다.


요약 


  • 콜백 함수는 펑키 한 작업을 수행하기 위해 함수에 넣는 함수입니다.
  • 콜백 함수는 최하위 또는 내부 함수라고도 합니다.
  • "부모"함수는 최상위 또는 외부 함수이라고도 합니다.
  • 콜백은 기능을 확장하고 프로젝트를 깨끗하게 유지하는 좋은 방법입니다.
  • 익명 함수는 이름이 없는 함수입니다.
  • 익명 함수의 배열은 순차적 루틴을 실행하는 아주 좋은 방법입니다.


댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.