PHP의 runkit 확장은 어떻게 사용합니까

5736 단어 PHPrunkit확장

동적 수정 상수


define('A', 'TestA');

runkit_constant_redefine('A', 'NewTestA');

echo A; // NewTestA
신기하죠?이runkit 확장은 실행할 때 우리가 상량, 방법체, 클래스의 기능 확장을 동적으로 수정할 수 있도록 하는 것이다.물론 시스템 안전의 측면에서 볼 때 이 확장은 결코 추천하지 않는다.그 자체의 상량의 의미는 변하지 않는 양이기 때문에 그 자체는 수정해서는 안 된다.같은 이치로 실행할 때 동적으로 함수체나 클래스 정의를 바꾸는 내용은 이 함수나 클래스에 호출된 다른 코드에 영향을 미칠 수 있기 때문에 이 확장은 위험한 확장이다.
동적으로 상수를 수정하는 것 외에 우리는 runkit_를 사용할 수 있다constant_add() 、 runkit_constant_remove () 함수는 상수를 동적으로 증가하거나 삭제합니다.

설치


runkit 확장된 설치는github에서 다운로드한 후 정상적인 확장 컴파일을 하면 됩니다.pecl에서 다운로드한 것은 이미 유행이 지났습니다.
PHP5: http://github.com/zenovich/runkit
PHP7: https://github.com/runkit7/runkit7.git
clone이 성공한 후에 정상적인 확장 컴파일링 설치 절차를 진행하면 됩니다.

phpize
./configure
make
make install
서로 다른 PHP 버전은 서로 다른 버전의 확장을 설치해야 하는 동시에runkit7은 아직 개발 중이며 일부 함수는 아직 지원하지 않는다. 예를 들어
  • runkit_class_adopt
  • runkit_class_emancipate
  • runkit_import
  • runkit_lint_file
  • runkit_lint
  • runkit_sandbox_output_handler
  • runkit_return_value_used
  • Runkit_Sandbox
  • Runkit_Sandbox_Parent
  • 이 글의 테스트 코드를 쓸 때 상술한 함수나 클래스는 지원되지 않습니다.여러분은 PHP5 환경으로 원본의 확장이 정상적으로 사용될 수 있는지 테스트할 수 있습니다.

    하이퍼글로벌 변수 키 보기

    
    print_r(runkit_superglobals());
    //Array
    //(
    //    [0] => GLOBALS
    //    [1] => _GET
    //    [2] => _POST
    //    [3] => _COOKIE
    //    [4] => _SERVER
    //    [5] => _ENV
    //    [6] => _REQUEST
    //    [7] => _FILES
    //    [8] => _SESSION
    //)
    이 함수는 현재 실행 환경의 모든 초전역 변수 키 이름을 보는 것입니다.이것들은 모두 우리가 자주 사용하는 일부 초전역 변수들이니 일일이 설명하지 않겠다.

    방법 관련 조작


    방법 조작은 상량 조작과 마찬가지로 우리는 동적으로 각종 방법을 추가, 수정, 삭제, 이름을 바꿀 수 있다.우선 우리가 가장 관심을 가지는 동적 운행을 할 때 방법체 안의 논리 코드를 수정하는 것을 보자.
    
    function testme() {
      echo "Original Testme Implementation
    "; } testme(); // Original Testme Implementation runkit_function_redefine('testme','','echo "New Testme Implementation
    ";'); testme(); // New Testme Implementation
    testme () 방법을 정의하고 runkit_function_redefine () 은 구현을 수정합니다. 마지막으로testme () 를 다시 호출할 때 출력하는 것은 새로 수정된 구현입니다.그럼 PHP가 자체적으로 가지고 있는 방법을 수정할 수 있을까요?
    
    // php.ini runkit.internal_override=1
    runkit_function_redefine('str_replace', '', 'echo "str_replace changed!
    ";'); str_replace(); // str_replace changed! runkit_function_rename ('implode', 'joinArr' ); var_dump(joinArr(",", ['a', 'b', 'c'])); // string(5) "a,b,c" array_map(function($v){ echo $v,PHP_EOL; },[1,2,3]); // 1 // 2 // 3 runkit_function_remove ('array_map'); // array_map(function($v){ // echo $v; // },[1,2,3]); // PHP Fatal error: Uncaught Error: Call to undefined function array_map()
    코드 안의 주석이 매우 명확하게 말했으니, 우리는 php에만 있어야 한다.ini에 runkit을 설정합니다.internal_override=1, PHP가 가지고 있는 방법 함수를 동적으로 수정할 수 있습니다.예를 들면 첫 번째 단락에서str_를 수정했어요.replace () 방법으로 그가 직접 문자를 출력할 수 있도록 했다.그리고 우리는implode()를joinArr()로 개명하면implode()처럼 이joinArr()를 사용할 수 있습니다.마지막으로 array_를 삭제했습니다.맵 () 방법, 이 방법을 다시 호출하면 오류가 발생합니다.

    클래스 방법 관련 조작


    클래스 내부 방법 함수의 조작은 상기 변수 방법의 조작과 유사하지만 PHP가 가지고 있는 클래스에 대해서는 수정할 수 없습니다.이건 여러분이 직접 시도해 보세요.
    
    //runkit_method_add('PDO', 'testAddPdo', '', 'echo "This is PDO new Func!
    ";'); //PDO::testAddPdo(); // PHP Warning: runkit_method_add(): class PDO is not a user-defined class
    오류 정보를 보면 PDO 클래스는 사용자가 정의한 클래스가 아니기 때문에runkit 함수를 사용하여 관련 조작을 할 수 없습니다.그러면 우리가 사용자 정의한 클래스가 어떻게 runkit을 사용하여 동적 조작을 하는지 봅시다.
    
    class Example{
    }
    
    runkit_method_add('Example', 'func1', '', 'echo "This is Func1!
    ";'); runkit_method_add('Example', 'func2', function(){ echo "This is Func2!
    "; }); $e = new Example; $e->func1(); // This is Func1! $e->func2(); // This is Func2! runkit_method_redefine('Example', 'func1', function(){ echo "New Func1!
    "; }); $e->func1(); // New Func1! runkit_method_rename('Example', 'func2', 'func22'); $e->func22(); // This is Func2! runkit_method_remove('Example', 'func1'); //$e->func1(); // PHP Fatal error: Uncaught Error: Call to undefined method Example::func1()
    우리는 빈 클래스를 정의한 후에 동적으로 두 가지 방법을 추가한 후에 방법 1을 수정하고 방법 2를 이름을 바꾸었다. 마지막으로 방법 1을 삭제했다. 일련의 조작은 사실 위의 일반적인 방법의 조작과 기본적으로 같다.

    총결산


    위에서 말한 바와 같이 이 확장은 비교적 위험한 확장이다. 특히 런킷을 켜면.internal_override 이후 PHP의 원래 함수도 수정할 수 있습니다.그러나 그것을 사용해야 한다면 이 기능들은 매우 유용하다.방문자 모드와 마찬가지로'대부분의 경우 방문자 모드가 필요하지 않지만, 일단 방문자 모드가 필요할 때, 그것은 정말 그것을 필요로 하는 것이다'라는 런킷 확장도 마찬가지다.
    테스트 코드:
    https://github.com/zhangyue0503/
    이상은 PHP의runkit 확장이 어떻게 사용되는지에 대한 상세한 내용입니다. PHP runkit 확장의 사용에 관한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기