PHP의 runkit 확장은 어떻게 사용합니까
동적 수정 상수
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은 아직 개발 중이며 일부 함수는 아직 지원하지 않는다. 예를 들어하이퍼글로벌 변수 키 보기
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 확장의 사용에 관한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.