댓글 검색 목록

[php] PHP Hooks – 초보자 용 가이드

페이지 정보

작성자 운영자 작성일 20-04-18 16:31 조회 1,080 댓글 0

비공식적인 훅 


PHP 훅을 구현하는 방법에 대한 튜토리얼에 오신 것을 환영합니다. 후크에 대해 들어 보았거나 WordPress, Drupal, Codeigniter 및 기타 여러 플랫폼에서 이미 사용했거나 다른 프로그래밍 언어를 알고 PHP에서 후크가 어떻게 작동하는지 궁금할 것입니다. 잠깐만 요. PHP에는 실제로 후크가 없습니다.


그러나 혼란스러워하는 초보자 코드 사용자에게는 PHP가 기본적으로 후크 사용을 구현하지 않는다는 것을 의미합니다. Wordpress, Drupal 및 사용하는 모든 패키지에는 자체 버전의 "시뮬레이트 된 후크"가 있습니다. 

여기서 무슨 일이 일어나고 있습니까? 후크란 무엇입니까? 왜 고리가 필요한가요? 알아 보려면 계속 읽으십시오!


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


소스 코드 다운로드 


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


소스 코드 다운로드 


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


빠른 시작 


  • 폴더에 다운로드하여 압축을 풉니다.
  • 관련된 데이터베이스가 없으므로 포함 된 각 파일을 따라 가십시오.

기본 


코드 예제로 들어가기 전에 기본적인 기본 질문에 답하는 것으로 시작하고 무슨 일이 일어나고 있는지 이해하는 데 도움을 드리겠습니다. 도대체 훅이 무엇이며, 무엇을 하며, 왜 필요한가?


후크란 무엇입니까? 


컴퓨터 프로그래밍에서 후킹이라는 용어는 소프트웨어 구성 요소간에 전달되는 기능 호출 또는 메시지 또는 이벤트를 가로 채서 운영 체제, 응용 프로그램 또는 기타 소프트웨어 구성 요소의 동작을 변경하거나 확장하는 데 사용되는 다양한 기술을 포함합니다. 


Wikipedia와 다른 여러 괴짜 웹 사이트들도 비슷한 대답을 제공한다고 말합니다. 이것이 무엇을 의미합니까? 더 실용적인 예는 갈고리를 더 잘 설명 할 수 있습니다. 우리는 사용자 등록을 다루는 기능을 가지고 있는데, 사용자 등록 정보를 데이터베이스에 저장합니다.


php-hook-1.jpg 


그것은 간단하고 우리가 일반적으로 할 일입니다. 그러나 여기에 비틀기가 있습니다. 저장을 처리하기 전에 입력을 확인하려면 어떻게 해야 합니까? 성공적으로 저장 한 후 이메일을 보내려면 어떻게 합니까?


php-hook-2.jpg 


여기에서 후크를 사용하여 저장을 시작하기 직전에 검사 입력을 가로 채고 저장 직후 이메일을 보내기 위해 가로채는 곳입니다.


왜 후크를 사용합니까? 


어리 석고 비효율적이지 않습니까? 후크를 사용하기 위해 너무 많은 로터리 문제를 해결해야 하는 이유는 무엇입니까? 방금 사용자 저장 기능을 수정하고 입력 확인을 영구적으로 코딩하고 전자 메일을 보낼 수 있습니다. 그러나 이것은 우리가 이런 식으로 핵심 기능을 수정하고 있음을 의미합니다.


Save user가 많은 시스템에서 공통적으로 사용되는 기능이라면? 예를 들어, 국제 회사에는 중앙 집중식 사용자 데이터베이스가 있으며 동일한 사용자 저장 기능을 사용합니다. 국가마다 주소 형식, 전화 형식이 다르거나 일부 국가는 저장 후 전자 메일을 보내는 것 이상을 수행하므로 핵심 기능을 수정하는 것은 의미가 없습니다.


이것이 우리에게 후크가 필요한 이유입니다. 개별 지역 또는 별도의 시스템이 자체 사용자 정의를 구현할 수 있으므로 핵심 기능을 그대로 유지하십시오. WordPress, Drupal, CodeIgniter 등과 같은 많은 패키지에서도 마찬가지입니다. 우리는 사용자 정의를 유지하고 핵심 라이브러리 파일이 새 버전으로 대체 될 때 패키지 업데이트에서 잃어 버리지 않기를 원합니다.


후크 대 콜백 대 이벤트 


이 단계에서 일부 고급 코드 사용자들은 후크가 이벤트 및 콜백과 같은 것이라고 생각해야 합니다. 예, 그들은 가까운 친척이지만 동일하지는 않습니다.


  • 어떤 일이 발생하면 이벤트가 시작되고 상황을 처리하기 위해 코드 블록을 작성합니다.
  • 콜백은 루틴을 완료하기 위해 다른 함수로 전달되는 함수입니다.
  • 후크는 인터셉터입니다. 그것들은 정상적인 프로세스를 중단하고 보통 함수가 시작되기 전에 또는 함수가 끝나기 직전에 배치합니다.


HOOKS IN PHP 


안타깝게도 후크는 PHP에서 기본적으로 사용할 수 없지만 PHP에서 자체 "후크 같은"구현을 하는 것을 막지는 못합니다. 워드 프레스, 코드 이그나이터, 드루팔은 모두 자체 후크 구현을 가지고 있습니다. 어떻게 합니까? 이 섹션에서 알아보십시오.


추신 후크 사용 방법에 대해서는 해당 패키지의 공식 문서를 읽으십시오. 이 섹션은 원시 PHP에서 후크를 모방 할 수 있는 방법 만 설명합니다.


HOOKS WITH FUNCTIONS 


함수가 있는 경우 함수를 실행하여 PHP에서 후크를 에뮬레이트하는 가장 일반적인 방법 중 하나입니다. 우리는 사용자를 데이터베이스에 저장하는 데 위의 예를 재사용 할 것이며 여기에 저장을 수행 할 핵심 라이브러리 파일이 있습니다.


<?php class Users { function saveUser ($data) { // saveUser() : save user to the database // PARAM $data : array of user data // - name : name of user // - email : email of user // - tel : telephone of user // - pass : password // PROCEED FLAG $pass = true; // BEFORE HOOK if (function_exists("beforeUserSave")) { $pass = beforeUserSave($data); } // SAVE USER TO DATABASE // Well, we are not really going to do up an actual database here // So just as an incomplete pseudo example - if ($pass) { $sql = "INSERT INTO `users` (`name`, `email`, `tel`, `pass`) VALUES (?, ?, ?, ?)"; $input = [$data['name'], $data['email'], $data['tel'], $data['pass']]; // $this->stmt = $this->pdo->prepare($sql); // $pass = $this->stmt->execute($input); } // AFTER HOOK if ($pass && function_exists("afterUserSave")) { $pass = afterUserSave($data); } // THE RESULT return $pass; } } 


그 두 함수 _ 존재하는 것을 주목하라. 그러나 우리는 이러한 기능을 정의하기 만하면 됩니다.


<?php // INIT require "1-lib-users.php"; $userLib = new Users(); // THE HOOKS function beforeUserSave ($user) { echo "BEFORE USER SAVE HOOK<br>"; print_r($user); echo "<br>"; // Do some checks here $pass = true; if (strlen($user['name'])<2) { $pass = false; } return $pass; } function afterUserSave ($user) { echo "AFTER USER SAVE HOOK<br>"; // Send confirmation email to user // @mail($user['email'], "Welcome", "Your account has been created"); return true; } // DUMMY USER TO SAVE $user = [ "name" => "John Doe", "email" => "john@doe.com", "tel" => "123456", "pass" => "VERYSECRET" ]; // PROCESS SAVE $pass = $userLib->saveUser($user); echo $pass ? "OK" : "ERROR!"; 


문제는 이런 식으로 많은 전역 함수를 정의해야 한다는 것입니다. 네임 스페이스를 사용하여 더 잘 정리할 수 있지만 여전히 많은 "후크 함수"가 떠 다니는 메모리 사용에는 여전히 건강에 좋지 않습니다.


HOOKS INTO EXTERNAL SCRIPTS


이것은 대신 후크 스크립트를 별도의 파일에 넣는 대체 버전입니다. 우리는 평소와 같이 핵심 라이브러리로 시작하지만, 함수 대신에 file_exists가있는 외부 스크립트를 찾습니다.


<?php class Users { function saveUser ($data) { // saveUser() : save user to the database // PARAM $data : array of user data // - name : name of user // - email : email of user // - tel : telephone of user // PROCEED FLAG $pass = true; // BEFORE HOOK if (file_exists("2-hook-saveuser-before.php")) { include "2-hook-saveuser-before.php"; } // SAVE USER TO DATABASE // Well, we are not really going to do up an actual database here // So just as an incomplete pseudo example - if ($pass) { $sql = "INSERT INTO `users` (`name`, `email`, `tel`, `pass`) VALUES (?, ?, ?, ?)"; $input = [$data['name'], $data['email'], $data['tel'], $data['pass']]; // $this->stmt = $this->pdo->prepare($sql); // $pass = $this->stmt->execute($input); } // AFTER HOOK if (file_exists("2-hook-saveuser-after.php")) { include "2-hook-saveuser-after.php"; } // THE RESULT return $pass; } } 


다음에는 후크 스크립트가 있습니다.


<?php echo "BEFORE USER SAVE HOOK<br>"; print_r($data); echo "<br>"; // Do some checks here $pass = true; if (strlen($data['name'])<2) { $pass = false; } 


<?php echo "AFTER USER SAVE HOOK<br>"; // Send confirmation email to user // @mail($data['email'], "Welcome", "Your account has been created"); 


마지막으로 프로세스 스크립트


<?php // INIT require "2-lib-users.php"; $userLib = new Users(); // DUMMY USER TO SAVE $user = [ "name" => "John Doe", "email" => "john@doe.com", "tel" => "123456", "pass" => "VERYSECRET" ]; // PROCESS SAVE $pass = $userLib->saveUser($user); echo $pass ? "OK" : "ERROR!"; 


이 방법은 많은 함수를 정의하는 것보다 훨씬 깨끗하지만 외부 스크립트를 찾아야 하기 때문에 상당히 느립니다.


HOOKS WITH CALLBACK 


이 마지막 방법은 일종의 정통적이지 않습니다. 여기서 콜백 함수를 코어 라이브러리에 전달하고 대신 후크로 사용합니다.


<?php class Users { function saveUser ($data, $before=null, $after=null) { // saveUser() : save user to the database // PARAM $data : array of user data // - name : name of user // - email : email of user // - tel : telephone of user // - pass : password // $before : Before hook // $after : After hook // PROCEED FLAG $pass = true; // BEFORE HOOK if ($before!=null) { $before($data); } // SAVE USER TO DATABASE // Well, we are not really going to do up an actual database here // So just as an incomplete pseudo example - if ($pass) { $sql = "INSERT INTO `users` (`name`, `email`, `tel`, `pass`) VALUES (?, ?, ?, ?)"; $input = [$data['name'], $data['email'], $data['tel'], $data['pass']]; // $this->stmt = $this->pdo->prepare($sql); // $pass = $this->stmt->execute($input); } // AFTER HOOK if ($after!=null) { $after($data); } // THE RESULT return $pass; } } 


<?php // INIT require "3-lib-users.php"; $userLib = new Users(); // DUMMY USER TO SAVE $user = [ "name" => "John Doe", "email" => "john@doe.com", "tel" => "123456", "pass" => "VERYSECRET" ]; // PROCESS SAVE $pass = $userLib->saveUser($user, // Before hook function ($data) { echo "BEFORE USER SAVE HOOK<br>"; print_r($data); echo "<br>"; // Do some checks here $pass = true; if (strlen($data['name'])<2) { $pass = false; } }, // After hook function () { echo "AFTER USER SAVE HOOK<br>"; // Send confirmation email to user // @mail($data['email'], "Welcome", "Your account has been created"); }); echo $pass ? "OK" : "ERROR!"; 


나는 여기에 있는 증오의 화염 트롤들 중 일부는“이것은 콜백 함수를 사용하는 방식이 아닙니다”라고 말할 것입니다… 그러나 이봐 – 그것은 작동합니다.


최고는 무엇입니까? 


위의 모든 방법은 가능한 솔루션이며 프로젝트에 가장 적합한 방법이 가장 좋은 방법입니다. 그러나 개인적으로 글로벌 기능을 정의하려고 합니다. 이것이 대부분의 프레임 워크와 패키지가 작동하는 방식입니다.



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

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