중 하나 주요 장점 PHP는 HTML 양식과 함께 작동하는 방식입니다. 여기서 핵심은 각 양식 요소가 PHP 프로그램에서 자동으로 사용 가능하게 된다는 것입니다. PHP에서 양식을 사용하는 방법에 대한 자세한 내용은 섹션을 참조하세요. 다음은 HTML 양식의 예입니다.

Beispiel #1 가장 간단한 HTML 형식

당신의 이름:

나이:

이 양식에는 특별한 것이 없습니다. 그것 정규형특별한 태그가 없는 HTML. 사용자가 양식을 작성하고 제출 버튼을 클릭하면 action.php 페이지가 호출됩니다. 이 파일에는 다음과 같은 내용이 포함될 수 있습니다.

Beispiel #2 렌더링 양식 데이터

안녕하십니까, .
너에게연령.

이 프로그램의 샘플 출력:

안녕하세요 세르게이입니다. 당신은 30 세입니다.

코드 조각을 고려하지 않으면 html특수문자()그리고 (int), 이 코드의 작동 원리는 간단하고 명확해야 합니다. html특수문자()악성 HTML 또는 Javascript가 페이지에 삽입되지 않도록 "특수" HTML 문자가 올바르게 인코딩되었는지 확인합니다. 숫자여야 하는 나이 필드를 다음으로 간단히 변환할 수 있습니다. 정수, 원치 않는 문자를 자동으로 제거합니다. PHP는 필터 확장을 사용하여 자동으로 이 작업을 수행할 수도 있습니다. $_POST["name"] 및 $_POST["age"] 변수는 PHP에 의해 자동으로 설정됩니다. 이전에는 $_SERVER 수퍼글로벌을 사용했지만 여기에서는 모든 POST 데이터를 포함하는 $_POST 수퍼글로벌도 사용합니다. 그것을주의해라 보내는 방법(메소드) 형식은 POST입니다. 방법을 사용한다면 가져 오기, 그러면 우리의 양식 정보는 $_GET 슈퍼글로벌에 있을 것입니다. 또는 데이터 소스가 관련이 없는 경우 $_REQUEST 변수를 사용할 수 있습니다. 이 변수에는 GET, POST, COOKIE 데이터가 혼합되어 있습니다.

15 년 전

HTTP 사양에 따르면 서버 측에서 어떤 상태를 변경하기 위해 양식을 사용할 때 POST 메서드를 사용해야 합니다. 예를 들어 페이지에 사용자가 다음과 같이 자신의 의견을 추가할 수 있는 양식이 있는 경우 여기 페이지에서 양식은 POST를 사용해야 하므로 이 페이지가 북마크되거나 캐시되지 않습니다.

양식이 서버에서 무언가를 가져올 때 GET 메소드를 사용해야 합니다. 그리고 아니실제로 무엇이든 변경합니다. 예를 들어, 검색 엔진의 양식은 GET을 사용해야 합니다. 웹 사이트를 검색하는 것은 클라이언트가 관심을 가질 만한 어떤 것도 변경해서는 안 되며, 검색 엔진 쿼리의 결과를 책갈피하거나 캐싱하는 것은 책갈피 또는 캐싱만큼 유용하기 때문입니다. 정적 HTML 페이지.

2 년 전

명확히 할 가치:

POST는 GET보다 안전하지 않습니다.

GET과 POST를 선택하는 이유는 요청 의도(정보를 "제출"하시겠습니까?), 요청 크기(URL 길이에 제한이 있으며 GET 매개변수가 URL), 작업을 얼마나 쉽게 공유할 수 있는지 -- 예를 들어 Google 검색은 URL을 공유하는 것만으로 검색어를 복사하고 다른 사람과 쉽게 공유할 수 있기 때문에 GET입니다.

GET이 POST보다 공유하기가 더 쉽기 때문에 보안은 여기에서 고려 사항일 뿐입니다. 예: 사용자가 결과 URL을 공유하고 실수로 비밀번호를 노출할 수 있기 때문에 GET에서 비밀번호를 보내지 않으려고 합니다.

그러나 GET 및 POST는 네트워크 연결 자체를 보호하기 위해 TLS/SSL을 배포하지 않으면 잘 배치된 악의적인 사람이 가로채기 쉽습니다.

HTTP(보통 포트 80)를 통해 전송되는 모든 양식은 안전하지 않으며, 오늘날(2017)에는 공개 웹사이트가 HTTPS(기본적으로 HTTP + 전송 계층 보안)를 사용하지 않는 데에는 합당한 이유가 많지 않습니다.

보너스로 TLS를 사용하면 사용자가 트래픽에 삽입하지 않은 코드(AD)가 삽입될 위험을 최소화할 수 있습니다.

필터와 이벤트는 테마와 플러그인이 변경 없이 핵심 동작을 변경할 수 있도록 합니다. 소스 파일 WordPress의 핵심. 이 기사에서는 WordPress에서 필터와 이벤트가 작동하는 방법과 테마 및 플러그인에서 사용하는 방법을 안내합니다.

개발

WordPress의 이벤트 또는 작업은 JavaScript의 이벤트와 매우 유사합니다. 이벤트는 do_action() 함수를 호출하여 실행되며 add_action() 함수를 사용하여 모든 이벤트에 함수를 추가할 수 있습니다.

이벤트나 액션이 실행되면 이벤트에 추가된 모든 기능이 특정 순서로 실행됩니다. 이것은 이해하기 가장 쉽습니다 간단한 예. 각각 1, 2, 3을 출력하는 세 가지 함수를 정의합니다.

함수 one() ( echo 1; ) function two() ( echo 2; ) function three() ( echo 3; )

add_action() 함수를 사용하여 foo 이벤트에 함수를 추가합니다.

add_action("푸", "하나"); add_action("foo", "2"); add_action("foo", "3");

그리고 do_action() 함수를 사용하여 이벤트를 실행합니다.

do_action("푸"); // 123을 출력

함수에 대한 첫 번째 인수는 이벤트의 이름인 문자열 foo입니다. 이름은 무엇이든 될 수 있지만 다른 플러그인 및 테마와의 충돌을 피하기 위해 자체 이벤트에 접두사를 사용하는 것이 좋습니다(예: myplugin_foo ). 여기서 myplugin은 플러그인 이름입니다.

add_action() 함수의 두 번째 인수는 이벤트가 실행될 때 호출되는 함수입니다. 동일한 이벤트 내의 함수는 이벤트에 추가된 순서와 동일한 순서로 실행됩니다. 단, 우선 순위가 높거나 낮은 이벤트에 함수가 추가되는 경우는 예외입니다. 우선 순위에 대해서는 나중에 자세히 설명합니다.

따라서 우리의 예는 함수 one() , two() 및 three() 를 순서대로 호출하여 123을 표시합니다. 물론 do_action() 대신 동일한 순서로 이러한 함수를 직접 호출할 수 있습니다. 같은 결과 . 그렇다면 이벤트를 사용하는 이유는 무엇입니까?

이벤트를 사용하는 이유

다른 플러그인이나 테마는 플러그인 코드를 수정하지 않고도 이벤트에서 기능을 쉽게 추가하거나 제거할 수 있습니다. 이 접근 방식은 플러그인을 더 유연하게 만듭니다. 예를 들어:

/* 다른 플러그인에서 */ function four() ( echo 4; ) remove_action("foo", "three"); add_action("foo", "4");

따라서 플러그인에서 foo 이벤트를 호출할 때 다른 플러그인이 remove_action()을 사용하여 이벤트에서 three() 함수를 제거하고 그 자리에 새로운 네 개의 함수를 추가했기 때문에 123 대신 124가 표시됩니다. .

숫자 출력이 있는 예는 가장 유용하지 않습니다. 실제로, 다음과 같이 다른 플러그인에 유용할 수 있는 테마 또는 플러그인의 이벤트를 생각해내는 것은 충분히 쉽습니다.

WordPress의 핵심에는 테마와 플러그인에서 사용할 수 있는 1500개 이상의 필터와 이벤트가 있다는 점도 주목할 가치가 있습니다.

필터

WordPress의 필터는 이벤트와 매우 유사합니다. 주요 차이점은 필터에는 각 바인딩된 함수에 전달하는 값이 있으므로 각 함수는 동일하거나 수정된 ​​값을 반환해야 한다는 것입니다. 간단한 예를 고려하십시오.

함수 plus_one($value) ( ​​​​$value = $value + 1; return $value; )

이 함수는 하나의 인수를 취하고 하나를 추가하고 결과를 반환합니다. add_filter()를 사용하여 새 필터에 함수를 추가해 보겠습니다.

Add_filter("foo", "plus_one");

이제 필터 foo에 추가된 모든 함수(이 경우에는 하나의 함수임)는 apply_filters() 함수를 사용하여 쉽게 호출하거나 "적용"할 수 있습니다.

echo apply_filters("foo", 5); // 6

필터링된 값을 두 번째 인수로 apply_filters() 함수에 전달합니다. 무엇이든 될 수 있으며 필터에 바인딩된 각 함수에 전달되며 모든 필터가 이 값을 변경할 수 있습니다.

이 경우 값 5가 원래 변수를 변경한 plus_one() 함수를 통해 전달되었기 때문에 값 6이 표시됩니다. remove_filter()를 사용하여 필터에서 함수를 제거하면 코드에 초기 값 5가 표시됩니다.

Remove_filter("foo", "plus_one"); echo apply_filters("foo", 5); // 5

이벤트와 마찬가지로 필터 기능은 다른 플러그인이나 테마에 추가할 수 있으며 이러한 기능은 우선 순위가 높거나 낮은 경우를 제외하고 필터에 추가된 순서대로 실행됩니다.

좋은 필터의 예

좀 더 흥미로운 예를 살펴보겠습니다. 프로필에 대한 링크를 포함할 배열을 만들어 보겠습니다 소셜 네트워크에서헤더에 이러한 링크를 표시합니다. 워드프레스 테마. 에 :

함수 get_my_social_profiles() ( $profiles = array("twitter" => "http://twitter.com/wpmagru", "facebook" => "http://facebook.com/wpmagru",), 반환 $profiles; )

반환된 배열은 header.php 파일의 루프에서 사용할 수 있습니다.

$profiles = get_my_social_profiles(); foreach ($profiles as $service => $url) ( printf("%s", esc_url($url), $service); )

/* functions.php에서 */ function get_my_social_profiles() ( $profiles = array("twitter" => "http://twitter.com/wpmagru", "facebook" => "http://facebook.com/wpmagru) ",); return apply_filters("my_social_profiles", $profiles); )

이 방법으로 모든 플러그인 또는 하위 테마에서 목록을 쉽게 관리할 수 있습니다. 소셜 프로필원래 테마를 건드리지 않고. 예를 들어 플러그인에서 다음 코드를 사용하여 Twitter 링크를 제거하고 Google+ 링크를 추가할 수 있습니다.

기능 change_my_social_profiles($profiles) ( unset($profiles["twitter"]); $profiles["google-plus"] = "https://plus.google.com/+wpmagru"; return $profiles; ) add_filter( "my_social_profiles", "change_my_social_profiles");

WordPress Core의 필터 및 이벤트

이미 언급했듯이 WordPress에는 핵심 동작을 변경하기 위해 플러그인이나 테마에서 사용할 수 있는 2000개 이상의 필터와 이벤트가 있습니다. 몇 가지 흥미로운 예를 살펴보겠습니다.

댓글 비활성화

다음 코드를 사용하여 매개변수의 설정에 따라 전체 사이트에 대한 댓글을 비활성화할 수 있습니다.

함수 my_comments_open() (거짓 반환; ) add_filter("comments_open", "my_comments_open");

comment_open 필터는 워드프레스 코어에서 매번 특정 기사의 댓글이 열려 있는지 확인하는 데 사용됩니다. 우리 함수는 이 필터에 대해 항상 false를 반환하므로 주석은 모든 곳에서 닫힙니다.

그건 그렇고, WordPress 코어는 이러한 필터로 작업하기 위한 몇 가지 도우미 기능을 정의합니다.

  • __return_true() - true를 반환합니다.
  • __return_false() - 거짓을 반환
  • __return_zero() - 0을 반환
  • __return_empty_string() - 빈 문자열을 반환합니다.
  • __return_empty_array() - 빈 배열을 반환합니다.
  • __return_null() - null을 반환

즉, comment_open에 대한 필터는 한 줄로 다시 작성할 수 있습니다.

Add_filter("comments_open", "__return_false");

자동 따옴표 길이 변경

excerpt_length 필터는 자동 따옴표의 길이를 담당합니다.

함수 my_excerpt_length($length) ( $length = 10; 반환 $length; ) add_filter("excerpt_length", "my_excerpt_length");

excerpt_more 필터를 사용하여 자동 인용의 끝에 배치되는 텍스트를 변경할 수 있습니다. 기본적으로 [...]입니다.

함수 my_excerpt_more($more) ( $more = "→"; 반환 $more ) add_filter("excerpt_more", "my_excerpt_more");

각 기사의 내용에 배너 추가

_content 필터는 각 기사의 내용을 렌더링하기 전에 실행됩니다. 기사 자체의 내용이 필터를 통과하므로 플러그인을 사용하여 즉시 배너를 쉽게 추가할 수 있습니다.

함수 my_banner($content) ( $banner = " "; $content = $banner . $content; 반환 $content; ) add_filter("the_content", "my_banner");

섹션에 favicon.ico 추가

장에서 각 테마는 wp_head 이벤트를 발생시킵니다. 이 이벤트 동안 favicon.ico 파일에 대한 링크를 표시하고 임의의 JavaScript 또는 CSS 코드를 삽입하는 등의 작업을 수행할 수 있습니다.

함수 my_favicon() ( 에코 " ";) add_action("wp_head", "my_favicon");

외부 .js 또는 .css 파일을 포함해야 하는 경우 wp_head 에서가 아니라 wp_enqueue_scripts 이벤트 중에 wp_enqueue_script() 및 wp_enqueue_style() 함수를 사용하여 포함해야 합니다.

WordPress의 모든 버전은 점점 더 새롭고 유용한 필터와 이벤트를 추가합니다. 커널에 있는 대부분의 필터 및 이벤트 목록은 Adam Brown의 사이트 또는 커널 파일에서 "do_action" 및 "apply_filters"를 검색하여 찾을 수 있습니다.

우선순위

필터 및 이벤트에 추가된 기능은 추가된 순서대로 실행되지만 우선 순위를 사용하여 쉽게 순서를 변경할 수 있습니다. 우선 순위는 add_action() 및 add_filter() 함수에 대한 세 번째 인수로 지정됩니다.

이 인수가 없으면 기본적으로 함수가 필터 및 이벤트에 추가됩니다. 우선순위 10. 기능은 낮은 우선 순위에서 높은 우선 순위로 실행됩니다. 우선 순위가 낮을수록 함수가 더 빨리 실행됩니다.

숫자 예제로 돌아가 보겠습니다.

add_action("푸", "하나"); add_action("foo", "2"); add_action("foo", "3"); do_action("푸"); // 123을 출력

three() 함수의 실행 우선 순위를 9로 변경하면 다른 함수보다 먼저 실행됩니다.

add_action("푸", "하나"); add_action("foo", "2"); add_action("foo", "3", 9); do_action("푸"); // 312를 출력

마찬가지로, one() 함수에 우선 순위를 11로 지정하면 add_action()으로 먼저 추가되었더라도 실행되는 마지막 함수가 됩니다.

Add_action("foo", "one", 11); add_action("foo", "2"); add_action("foo", "3", 9); do_action("푸"); // 321을 출력

추가 옵션

필터 또는 이벤트에 바인딩된 각 함수에서 전달하기 쉽습니다. 추가 옵션. 이것은 do_action() 또는 apply_filters() 함수를 호출할 때 수행됩니다. 예를 들면 다음과 같습니다.

Do_action("foo", $arg1, $arg2, $arg3); $value = apply_filters("foo", $value, $arg1, $arg2, $arg3);

요점은 필터 또는 이벤트에 함수를 추가할 때 수락할 인수의 수를 지정해야 하며 add_action() 및 add_filter() 함수의 네 번째 매개변수가 이를 담당한다는 것입니다.

예를 들어 foo 이벤트 함수에서 세 개의 인수를 모두 수락하려면 add_action()의 네 번째 매개변수로 3을 지정해야 합니다.

함수 my_func($arg1, $arg2, $arg3) ( ... ) add_action("foo", "my_func", 10, 3);

유사하게, 필터에 추가된 함수에서 $arg1만 추가 인수로 허용하려는 경우 add_filter()에 두 개의 인수만 전달하도록 요청합니다. 첫 번째 인수는 $value이고 두 번째 추가 인수는 $arg1입니다.

함수 my_func($value, $arg1) ( ... ) add_filter("foo", "my_func", 10, 2);

예시

추가 인수를 전달하는 좋은 예는 사용자의 비밀번호 재설정을 비활성화하는 데 사용할 수 있는 allow_password_reset 필터입니다.

Add_filter("allow_password_reset", "__return_false");

이렇게 하면 사이트의 모든 사용자에 대한 비밀번호 재설정이 비활성화되지만 네트워크의 최고 관리자(보안 목적)에 대해서만 비밀번호 재설정을 비활성화해야 하는 경우 추가 인수를 사용할 수 있습니다.

함수 my_filter($allow, $user_id) ( if (is_super_admin($user_id)) $allow = false; return $allow; ) add_filter("allow_password_reset", "my_filter", 10, 2);

필터 바운드 함수는 필터에 전달된 첫 번째 인수만 수정할 수 있습니다. 즉, 위의 함수는 $user_id가 아닌 $allow 인수만 변경할 수 있습니다.

함수가 두 개 이상의 전달된 인수를 수정할 수 있도록 하기 위해 필터(및 이벤트)는 예를 들어 pre_get_posts 이벤트와 마찬가지로 PHP에서 참조로 변수와 객체를 전달할 수 있습니다.

OOP, 클래스, 객체 및 익명 함수

테마 개발자 및 워드프레스 플러그인대부분의 코드가 전역 공간이 아닌 객체 내부에서 실행되는 객체 지향 프로그래밍 스타일이 선호되는 경우가 많습니다. add_action() 및 add_filter() 함수가 호출할 함수가 아니라 객체 메서드를 전달해야 하는 경우 특수 배열 형식으로 전달해야 합니다.

Class My_Class ( function __construct() ( add_filter("the_content", array($this, "filter_content")); ) function filter_content($content) ( // ... return $content; ) ) new My_Class();

마찬가지로 보낼 수 있습니다 정적 메서드수업:

Add_filter("the_content", array("My_Class", "filter_content")); add_filter("the_content", "My_Class::filter_content"); // PHP >= 5.2.3

필터 및 이벤트는 다음과 같은 익명 함수도 지원합니다.

Add_filter("the_content", create_function("$content", "return $content;")); add_filter("the_content", function($content) ( $content 반환; )); // PHP >= 5.3

WordPress에서 필터 및 이벤트와 함께 익명 함수를 사용하는 것은 권장하지 않습니다. 이는 디버그하기 어렵고(예: 플러그인 사용) create_function() 함수가 APC와 같이 바이트 코드 수준에서 캐시되지 않기 때문입니다.

결론

필터와 이벤트는 WordPress 자체의 핵심이며 모든 테마 및 플러그인 개발자는 필터와 이벤트가 인기 있는 시스템의 핵심을 확장할 수 있기 때문에 사용 방법을 배워야 합니다.

WordPress 테마 및 플러그인 개발자는 제품 내부의 필터 및 이벤트를 잊어서는 안 됩니다. 이를 통해 제품을 보다 모듈화되고 유연하며 타사 코드로 쉽게 수정할 수 있습니다.

WordPress의 필터 및 이벤트에 대해 질문이 있는 경우 댓글을 남겨주시면 연락드리겠습니다.

RxGroovy에는 여러 Do 변형이 있습니다.

  • 자바독:
  • 자바독:

  • 자바독:

doOnRequest 연산자(RxGroovy 1.1의 새로운 기능)는 관찰자가 결과 Observable에서 추가 항목을 요청할 때마다 호출될 Action을 등록합니다. 해당 작업은 관찰자가 요청하는 항목 수를 매개변수로 받습니다.

  • 자바독:

  • 자바독:

  • 자바독:

  • 자바독:

  • 자바독:

~ 전에

  • 자바독:

~ 후에결과 Observable은 정상적으로든 오류가 있든 종료됩니다.

샘플 코드

def 숫자 = observable.from(); number.finallyDo(( println("최종"); )).subscribe(( println(it); ), // onNext( println("오류: " + it.getMessage()); ), // onError( println ("시퀀스 완료"); ) // onCompleted);

1 2 3 4 5 시퀀스 완료 최종적으로

  • 자바독:

RxJava에는 몇 가지 Do 변형이 있습니다.

doOnEach 연산자를 사용하면 결과 Observable이 항목을 방출할 때마다 호출할 콜백을 설정할 수 있습니다. 당신은 할 수 있습니다이 콜백을 다양한 알림을 유일한 매개변수로 사용하는 Action 형식으로 전달하거나, Observable을 구독한 것처럼 onNext 메서드가 호출되는 Observer를 전달할 수 있습니다.

  • 자바독:
  • 자바독:

doOnNext 연산자는 매개변수로 전달하는 Action을 제외하고는 doOnEach(Action1)와 매우 유사합니다. 하지 않습니다알림을 수락하지만 대신 단순히 방출된 항목을 수락합니다.

샘플 코드

Observable.just(1, 2, 3) .doOnNext(새로운 Action1 () ( @Override public void call(Integer item) ( if(item > 1) ( throw new RuntimeException("항목이 최대값을 초과함"); ) ))).subscribe(new Subscriber () ( @Override public void onNext(Integer item) ( System.out.println("Next: " + item); ) @Override public void onError(Throwable error) ( System.err.println("Error: " + error) .getMessage()); ) @Override public void onCompleted() ( System.out.println("순서가 완료되었습니다."); ) ));

다음: 1 오류: 항목이 최대값을 초과함

  • 자바독:

doOnRequest 연산자(RxJava 1.1의 새로운 기능)는 관찰자가 결과 Observable에서 추가 항목을 요청할 때마다 호출되는 Action을 등록합니다. 해당 작업은 관찰자가 요청하는 항목 수를 매개변수로 받습니다.

  • 자바독:

doOnSubscribe 연산자는 관찰자가 결과 Observable을 구독할 때마다 호출될 Action을 등록합니다.

  • 자바독:

doOnUnsubscribe 연산자는 관찰자가 결과 Observable에서 구독을 취소할 때마다 호출될 Action을 등록합니다.

  • 자바독:

doOnCompleted 연산자는 결과 Observable이 정상적으로 종료되면 호출될 Action을 등록하고 onCompleted를 호출합니다.

  • 자바독:

doOnError 연산자는 결과 Observable이 비정상적으로 종료되면 호출될 Action을 등록하여 onError를 호출합니다. 이 작업은 오류를 나타내는 Throwable로 전달됩니다.

  • 자바독:

doOnTerminate 연산자는 다음과 같이 호출될 Action을 등록합니다. ~ 전에결과 Observable은 정상적으로든 오류가 있든 종료됩니다.

  • 자바독:

finallyDo는 RxJava 1.1.1부터 더 이상 사용되지 않으며 동일한 동작으로 doAfterTerminate를 사용합니다.

finally Do 연산자는 바로 호출될 Action을 등록합니다. ~ 후에결과 Observable은 정상적으로든 오류가 있든 종료됩니다.

  • 자바독:

doAfterTerminate 연산자는 다음과 같이 호출될 Action을 등록합니다. ~ 후에결과 Observable은 정상적으로든 오류가 있든 종료됩니다.

  • 자바독:


RxJS는 기본 Do 연산자를 do 또는 tap(동일한 연산자에 대한 두 개의 이름)으로 구현합니다. 이 연산자를 사용하는 방법에는 두 가지 선택이 있습니다.

  1. Observer를 전달할 수 있습니다. 이 경우 do / tap은 Observer가 결과 Observable을 구독한 것처럼 해당 Observer의 메서드를 호출합니다.
  2. do / tap이 관찰자의 유사한 이름의 함수와 함께 호출하는 1-3개의 개별 함수(onNext , onError 및 onCompleted) 세트를 전달할 수 있습니다.

샘플 코드

/* 관찰자 사용 */ var 관찰자 = Rx.Observer.create(function (x) ( console.log("다음 작업: %s", x); ), function (err) ( console.log("Do Error : %s", err); ), 함수() ( console.log("완료됨"); )); var 소스 = Rx.Observable.range(0, 3) .do(관찰자); var subscription = source.subscribe(function (x) ( console.log("다음: %s", x); ), function (err) ( console.log("오류: %s", err); ), function () (console.log("완료"); ));

/* 함수 사용 */ var source = Rx.Observable.range(0, 3) .do(function (x) ( console.log("다음 작업:", x); ), function (err) ( console. log("오류 실행:", err); ), function () ( console.log("완료됨"); )); var subscription = source.subscribe(function (x) ( console.log("다음: %s", x); ), function (err) ( console.log("오류: %s", err); ), function () (console.log("완료"); ));

다음 수행: 0 다음: 0 다음 수행: 1 다음: 1 다음 수행: 2 다음: 2 완료 완료


RxJS는 또한 doOnNext 또는 tapOnNext(동일한 연산자에 대한 두 개의 이름)를 구현합니다. 매개변수로 제공하는 콜백 함수를 호출하여 onNext의 경우에만 응답하는 Do의 특수한 형태입니다. 콜백 함수가 실행될 때 콜백 함수의 관점에서 " this " 객체가 될 두 번째 매개변수를 선택적으로 전달할 수도 있습니다.

샘플 코드

var 소스 = Rx.Observable.range(0, 3) .doOnNext(function() ( this.log("다음 작업: %s", x); ), 콘솔); var subscription = source.subscribe(function (x) ( console.log("다음: %s", x); ), function (err) ( console.log("오류: %s", err); ), function () (console.log("완료"); ));

다음 수행: 0 다음: 0 다음 수행: 1 다음: 1 다음 수행: 2 다음: 2 완료


RxJS는 또한 doOnError 또는 tapOnError(동일한 연산자에 대한 두 개의 이름)를 구현합니다. 매개변수로 제공하는 콜백 함수를 호출하여 onError 경우에만 응답하는 Do의 특수 형식입니다. 콜백 함수가 실행될 때 콜백 함수의 관점에서 " this " 객체가 될 두 번째 매개변수를 선택적으로 전달할 수도 있습니다.

샘플 코드

var 소스 = Rx.Observable.throw(새로운 오류()); .doOnError(function (err) ( this.log("오류 실행: %s", err); ), 콘솔); var subscription = source.subscribe(function (x) ( console.log("다음: %s", x); ), function (err) ( console.log("오류: %s", err); ), function () (console.log("완료"); ));

오류 수행: 오류 오류: 오류


RxJS는 또한 doOnCompleted 또는 tapOnCompleted(동일한 연산자에 대한 두 개의 이름)를 구현합니다. 매개변수로 제공하는 콜백 함수를 호출하여 onCompleted 경우에만 응답하는 Do의 특수 형식입니다. 콜백 함수가 실행될 때 콜백 함수의 관점에서 " this " 객체가 될 두 번째 매개변수를 선택적으로 전달할 수도 있습니다.

샘플 코드

var 소스 = Rx.Observable.range(0, 3) .doOnCompleted(function () ( this.log("완료 완료"); ), 콘솔); var subscription = source.subscribe(function (x) ( console.log("다음: %s", x); ), function (err) ( console.log("오류: %s", err); ), function () (console.log("완료"); ));

다음: 0 다음: 1 다음: 2 완료 완료


RxJS는 또한 finally 연산자를 구현합니다. 일반적으로(onCompleted) 또는 비정상적으로(onError) 상관없이 결과 Observable이 종료된 후 호출될 함수를 취합니다.

샘플 코드

var 소스 = Rx.Observable.throw(new Error()) .finally(function() ( console.log("마침내"); )); var subscription = source.subscribe(function (x) ( console.log("Next: " + x); ), function (err) ( console.log("Error: " + err); ), function () ( 콘솔 .log("완료"); ));

오류: 마지막으로 오류

do / tap , doOnNext / tapOnNext , doOnError / tapOnError , doOnCompleted / tapOnCompleted , 그리고 마지막으로 다음 각 배포판에서 찾을 수 있습니다.

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP는 이 연산자를 do로 구현합니다.

관찰 가능한 시퀀스의 각 요소에 대한 작업을 호출하고 관찰 가능한 시퀀스의 정상적이거나 예외적인 종료 시 작업을 호출합니다. 이 방법을 사용할 수 있습니다 디버깅을 위해, 로깅 등 파이프라인에서 메시지에 대한 임의의 작업을 실행하기 위해 메시지 스트림을 가로채는 쿼리 동작. do를 사용할 때 스트림이 완료되거나 오류가 발생한 후(예: 반복 또는 재구독을 사용할 때) Observer가 추가 이벤트를 수신할 수 있다는 점에 유의하는 것이 중요합니다. AbstractObservable을 확장하는 Observable을 사용하는 경우 이러한 이벤트를 수신하지 않습니다. 이 특별한 경우에는 DoObserver를 사용하십시오. doOnNext, doOnError 및 doOnCompleted는 내부적으로 DoObserver를 사용하며 이러한 추가 이벤트를 수신합니다.

샘플 코드

//https://github.com/ReactiveX/RxPHP/blob/master/demo/do/do.php에서 $source = \Rx\Observable::range(0, 3) ->do(함수($x) ( echo "Do Next:", $x, PHP_EOL; ), function (Throwable $err) ( echo "Do Error:", $err->getMessage(), PHP_EOL; ), function () ( echo "완료됨" , PHP_EOL; )); $subscription = $source->subscribe($stdoutObserver);

다음 수행:0 다음 값: 0 다음 수행:1 다음 값: 1 다음 수행:2 다음 수행: 2 완료 완료!

RxPHP에는 doOnError 연산자도 있습니다.

샘플 코드

//https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnError.php에서 $source = \Rx\Observable::error(new Exception("죄송합니다")) ->doOnError(함수 (Throwable $err) ( echo "오류 실행:", $err->getMessage(), PHP_EOL; )); $subscription = $source->subscribe($stdoutObserver);

오류 발생:죄송합니다 예외:죄송합니다

RxPHP에는 doOnCompleted 연산자도 있습니다.

샘플 코드

//https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnCompleted.php에서 $source = \Rx\Observable::empty() ->doOnCompleted(function() ( echo "완료 ", PHP_EOL; )); $subscription = $source->subscribe($stdoutObserver);

완료 완료!

RxPHP에는 finally 연산자도 있습니다.

소스가 완료 또는 오류로 종료될 때 지정된 함수를 호출합니다.

샘플 코드

//https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally.php에서 Rx\Observable::range(1, 3) ->finally(function() ( echo "마침내\n "; )) -> 구독($stdoutObserver);

다음 값: 1 다음 값: 2 다음 값: 3 완료! 드디어

//https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally-error.php Rx\Observable::range(1, 3) ->map(function($value) ( ​​​​if ($value == 2) ( throw new \Exception("error"); ) return $value; )) ->finally(function() ( echo "Finally\n"; )) ->subscribe($stdoutObserver );

다음 값: 1

이 문서에서는 PHP _SELF 변수의 사용에 대해 자세히 설명합니다.

PHP _SELF 변수는 무엇입니까?

_SELF PHP 변수는 현재 파일의 이름과 경로(문서 루트 기준)를 반환합니다. 양식의 action 속성에서 이 변수를 사용할 수 있습니다. 또한 알아야 할 몇 가지 뉘앙스가 있습니다. 물론 이러한 뉘앙스를 무시할 수 없습니다.

몇 가지 예를 살펴보겠습니다.

에코 $_SERVER["PHP_SELF"];

1) 당신의 PHP 파일다음 주소에 있습니다.

http://www.yourserver.com/form-action.php

이 경우 PHP _SELF 변수에는 다음이 포함됩니다.

"/form-action.php"

2) PHP 파일이 다음 주소에 있다고 가정합니다.

http://www.yourserver.com/dir1/form-action.php

PHP _SELF는 다음과 같습니다.

"/dir1/form-action.php"

양식의 작업 속성에 있는 PHP _SELF. 그녀는 왜 거기에 있었습니까?

대개 PHP 변수 _SELF는 form 태그의 action 속성에 사용됩니다. action 속성은 확인 후 양식 콘텐츠가 전송될 주소를 지정합니다(사용자가 type="submit"인 버튼을 클릭함). 일반적으로 이것은 양식이 떠난 동일한 페이지입니다.

그러나 양식에서 참조하는 파일의 이름을 바꾸면 action 속성에서 파일 이름을 바꿔야 합니다. 그렇지 않으면 양식이 작동하지 않습니다.

PHP _SELF 변수는 파일 이름을 기반으로 페이지 주소가 자동으로 생성되기 때문에 불필요한 수정을 방지합니다.

form-action.php 파일이 있고 양식을 제출한 후 동일한 파일에 양식을 제출하기를 원한다고 가정해 보겠습니다. 일반적으로 다음과 같이 작성됩니다.

그러나 form-action.php 대신 PHP의 _SELF 변수를 사용할 수 있습니다. 이 경우 코드는 다음과 같습니다.

" >

form-action.php용 코드

스크립트를 다음 형식과 결합해 보겠습니다.

$이름"; 에코"
다음 형식을 다시 사용하여 새 이름을 입력할 수 있습니다."; ) ?> ">

HTML 페이지 상단의 코드가 먼저 실행됩니다. 코드의 첫 번째 줄은 양식이 제출되었는지 여부를 확인합니다. $_POST["submit"]이 존재하면 IF 구문이 실행되고(TRUE) 사용자가 입력한 이름이 표시됩니다.

$_POST["submit"] 변수가 존재하지 않으면 양식이 제출되지 않았으므로 IF 구성이 실행되지 않습니다(FALSE). 따라서 사용자 이름이 표시되지 않습니다.

PHP _SELF 변수와 관련된 불필요한 포인트

_SELF PHP 변수는 현재 파일의 이름과 경로를 가져오는 데 사용됩니다(좋지만 해커도 사용할 수 있음). 페이지에 PHP _SELF가 있는 경우 사용자는 슬래시(/)를 입력하고 악성 XXS 스크립트를 작성할 수 있습니다.

예를 고려하십시오.

"메소드="포스트">

이제 사용자가 일반 url 에서 온 경우 주소 표시줄에 다음과 같이 표시됩니다.
http://www.yourdomain.com/form-action.php
위의 코드는 다음과 같이 읽을 수 있습니다.

이 경우 모든 것이 정상입니다.

이제 사용자가 주소 표시줄로 "화학화"를 시작하는 상황을 고려해 보겠습니다.
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert("xss")%3C
/스크립트%3E%3Cfoo%22

이 경우 PHP를 실행한 후 코드는 다음과 같습니다.

스크립트 태그와 경고 명령이 코드에 추가되었음을 직접 확인할 수 있습니다. 이 페이지가 로드되면 사용자에게 경고 창이 표시됩니다. 이것은 PHP _SELF 변수가 어떻게 악용될 수 있는지에 대한 간단한 예입니다.

스크립트 태그 사이에 모든 JavaScript 코드를 추가할 수 있습니다. 해커는 다른 서버에서 호스팅될 JavaScript 파일에 연결할 수도 있습니다. 이 파일에는 해커가 사용자 입력을 가로채기 위해 전역 변수를 변경하고 양식을 다른 주소로 리디렉션할 수 있는 악성 코드가 포함되어 있을 수 있습니다.

PHP _SELF로 문제를 피하는 방법

htmlentities() 함수를 사용하면 문제를 피할 수 있습니다. htmlentities() 함수가 있는 폼 코드를 살펴보십시오.

"메소드="포스트">

htmlentities() 함수는 가능한 모든 문자를 해당 HTML 엔티티로 변환합니다. 이제 PHP _SELF 변수를 우회하려는 시도는 실패하고 악성 코드 주입 결과는 다음과 같이 표현됩니다.