$ Globals 조작으로 인한 글로벌 주 혼돈을 디버깅합니다
$ Globals 조작은 PHP에서 예측할 수없는 버그를 유발할 수 있습니다. 디버그하고 해결하기 위해 1. $ globals는 모든 변수에 대한 글로벌 액세스를 제공하여 상태 변경을 어렵게 만듭니다. 2. 전략적 디버그 로깅과 GlobalWatcher 클래스를 사용하여 스냅 샷 및 보고서 변경을 사용하여 원치 않는 수정을 감지합니다. 3. XdeBug, Debug_backTrace ()를 사용하여 스택 추적을 사용하여 소스를 추적하고 $ Globals 할당에 대한 Codebase를 검색합니다. 4. App :: set ()/get ()와 같은 제어 된 서비스 컨테이너를 사용하여 종속성 주입에 대한 리팩토링을 통해 미래의 문제를 방지하고 PHPSTAN 또는 PHP_CODESNIFFER를 통해 코딩 표준을 시행하여 직접 $ Globals 액세스를 차단하여 궁극적으로 $ Global을 위험하지만 유용한 도구로 처리해야합니다.
PHP의 글로벌 변수, 특히 Superglobal $GLOBALS
기능 및 파일에서 데이터를 공유하는 편리한 방법이 될 수 있습니다. 그러나 잘못 사용될 때, 그들은 디버깅 악몽을 소개합니다. 특히 통제되지 않은 조작으로 인해 글로벌 주가 예측할 수 없게 될 때. 신비한 버그, 일관되지 않은 행동 또는 추적하기 어려운 부작용을 다루는 경우, $GLOBALS
변조가 범인 일 수 있습니다.

$GLOBALS
조작으로 인한 혼돈을 디버깅하고 해결하는 방법은 다음과 같습니다.
1. $GLOBALS
가하는 일을 이해하십시오
$GLOBALS
현재 글로벌 범위에 정의 된 모든 변수에 대한 참조를 포함하는 PHP 슈퍼 글로벌입니다. 변수 이름 (문자열)으로 색인이 표시되므로 $GLOBALS['foo']
글로벌 변수 $foo
를 나타냅니다.

$ foo = 'hello'; echo $ globals [ 'foo']; // 출력 : 안녕하세요
위험은 코드의 모든 부분 (장애, 파일, 타사 라이브러리 포함) $GLOBALS
에서 읽거나 쓰여서 명확한 가시성없이 글로벌 상태를 변경할 수 있기 때문에 발생합니다.
2. 원치 않는 수정을 감지하십시오
$GLOBALS
항상 액세스 할 수 있으므로 변경되는 곳을 추적하려면 의도적으로 검사가 필요합니다.

디버그 로깅을 전략적으로 사용하십시오
변경 사항을 모니터하기 위해 키 포인트에 로깅을 삽입하십시오.
함수 debug_globals ($ label) { error_log ( "=== globals snapshot : $ label ==="); foreach ([ 'imight_var', 'config', 'user'] as $ 키) {// 특정 키를 시청하십시오. if (isset ($ globals [$ key]) { error_log ( "$ key =". json_encode ($ globals [$ key]); } } } // 의심되는 지역 전후에 배치 debug_globals ( '기능 호출 전'); some_risky_function (); debug_globals ( '기능 호출 후');
이것은 예기치 않은 변화가 언제 어디서 발생하는지 식별하는 데 도움이됩니다.
글로벌 주 감시자 (고급) 설정
개발 중에 사용자 정의 핸들러를 사용하여 액세스를 마무리 할 수 있습니다.
클래스 GlobalSwatcher { 개인 정적 $ 스냅 샷; public static function takesNapShot () { self :: $ snapshot = array_keys ($ globals); } 공개 정적 함수 diffandReport () { $ current = array_keys ($ globals); $ adds = array_diff ($ current, self :: $ snapshot); $ removed = array_diff (self :: $ snapshot, $ current); if (! empty ($ add)) { ERROR_LOG ( "새로운 글로벌 추가 :". implode ( ',', $ adds)); } if (! empty ($ removed)) { error_log ( "글로벌 제거 :". impledod ( ',', $ removed)); } // 알려진 글로벌의 가치 변경 사항을 확인하십시오 foreach ([ '$ config', '$ user'] as $ var) { $ name = ltrim ($ var, '$'); if (isset (self :: $ snapshot [$ name]) && isset ($ globals [$ name]) { if (self :: $ snapshot [$ name]! == $ globals [$ name]) { error_log ( "Global variable \ $$ 이름이 수정되었습니다!"); } } } self :: $ snapshot = $ current; } } // 용법 GlobalSwatcher :: takesNapShot (); // ... 코드를 실행합니다 GlobalSwatcher :: diffandReport ();
돌연변이를 잡으려면 중요한 섹션 주위에서 이것을 실행하십시오.
3. 수정 원을 추적합니다
로그가 있더라도 글로벌이 변경되는 곳을 정확히 찾아내는 것은 어려울 수 있습니다.
단계별 검사를 위해 XDEBUG를 사용하십시오
XDEBUG를 활성화하고 IDE에서 중단 점을 설정하십시오. 그 다음에:
- 의심되는 파일/줄에 조건부 중단 점을 설정하십시오.
- 또는 전역이 변경 될 때 스택 추적을 캡처하기 위해 로그 콜 내부에서
debug_zval_dump()
또는var_dump(debug_backtrace())
사용하십시오.
예:
if (isset ($ global [ 'user']) && $ global [ 'user'] [ 'status']! == 'active') { error_log ( '사용자 상태 변경되었습니다!'); error_log (print_r (debug_backtrace (false), true); }
이것은 호출 스택이 돌연변이로 이어지는 것을 보여줍니다.
$GLOBALS
에 대한 쓰기에 대한 Codebase
명령 줄 도구를 사용하여 위험한 패턴을 찾으십시오.
grep -r "\ $ globals \ [ '"/path/to/project grep -r '\ $ globals \ ['/path/to/project | grep -v 'read_only'
찾기 :
- 직접 과제 :
$GLOBALS['x'] = ...
- 의도하지 않은 창조 :
$GLOBALS['configg']
- 루프 또는 조건부 내부 수정
포함, 자동 로더, 미들웨어 또는 레거시 코드에 특별한주의를 기울이십시오.
4. 미래의 혼란을 예방하십시오
문제를 디버깅 한 후에는 글로벌 상태에 대한 의존도를 줄입니다.
의존성 주입을 향한 리팩터
$GLOBALS['config']
에 액세스하는 대신 종속성을 명시 적으로 통과합니다.
함수 processUser ($ config, $ user) { // $ globals 대신 $ config를 사용합니다 [ 'config'] }
이것은 행동을 예측 가능하고 테스트 가능하게 만듭니다.
구성 컨테이너 또는 서비스 로케이터를 사용하십시오 (글로벌이 피할 수없는 경우)
전 세계적으로 상태를 공유 해야하는 경우 캡슐화하십시오.
클래스 앱 { 개인 정적 $ 서비스 = []; 공개 정적 함수 세트 ($ key, $ value) { self :: $ 서비스 [$ key] = $ value; } 공개 정적 함수 get ($ key) { return self :: $ Services [$ 키] ?? 널; } } // 제어 액세스 app :: set ( 'config', $ config); $ config = app :: get ( 'config');
이제 set()
에 로깅 또는 유효성 검사를 추가 할 수 있습니다.
코딩 표준을 통해 직접 $GLOBALS
액세스를 비활성화하십시오
php_codesniffer 또는 phpstan과 같은 도구를 사용하여 규칙을 시행합니다.
-
$GLOBALS
사용에 깃발을내는 스 니프를 만듭니다. - 또는 사전 커밋 후크에서 Regex를 사용하여
$GLOBALS\['
포함 된 커밋을 차단하십시오.
phpstan 규칙 예제 ( phpstan.neon
) :
매개 변수 : 무시자 : - '글로벌 변수에 대한 #ACCESS \ $ globals#'
더 나은 : 무시하지 마십시오 - 검출하고 제거하십시오.
결론
$GLOBALS
풋군입니다. 빠른 해킹을 가능하게하지만 상태 변경이 보이지 않거나 흩어질 때 지옥을 디버깅하게합니다. 통제를 되 찾으려면 :
- 핵심 지점에서 로그 및 스냅 샷 글로벌 상태.
- 배경 및 검색 도구로 수정을 추적합니다 .
- 명시 적 의존성을 향한 리팩토링 .
- 정적 분석으로 회귀를 방지하십시오 .
통제되지 않은 $GLOBALS
사용을 제거하면 앱이 더 관리 가능하고 테스트 가능하며 제정신이됩니다.
기본적으로, $GLOBALS
화재와 같은 대우 : 통제 된 조건에 유용하며, 체크되지 않은 상태에서 위험합니다.
위 내용은 $ Globals 조작으로 인한 글로벌 주 혼돈을 디버깅합니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Dependencyinjection(DI)issuperiortousing$GLOBALSbecauseitmakesdependenciesexplicit,whereas$GLOBALShidesthem.2.DIimprovestestabilitybyallowingeasymockingofdependencies,unlike$GLOBALSwhichrequiresmanipulatingglobalstate.3.DIreducestightcouplingbydecoup

$ globalsAllowsUnintendedVariableoverwriting의 비 점수를 확인하고, anabletackerstanipulateCriticalDatalikeUserIdsorroleswithoutValidation; 2.itincreasEtHeatTackSurfaceBreakingEncuctusion, MakingDectionsDependentOnMutableGabalStattCanBeexPloiTed

$ globalscreateshiddendendencies, MakingFunctionSharderToTest, Fragile 및 Nunreusable;

$ globalsmanipulationCancauseUnPredictableBugsInphp; TodebugandResolvet, 1. annderstand that globalsprovidesglobalAccesstoAllVaribles, MakingStateChangeshArdTotrack; 2.DetectunwantEdectunwantedModificationStrategicdebuggingAndaglobalglobalswatcherclastosnapshotan

$ globals와 Global은 기능의 글로벌 변수에 액세스하는 데 사용되지만 주요 차이점이 있습니다. 1. $ Globals는 $ globals [ 'var']와 같은 주요 이름을 통해 변수에 액세스하는 고 글로벌 배열이며, 글로벌은 언어 구조이며 글로벌 $ var는 선언해야합니다. 2. $ Globals는 사전 선언이 필요하지 않으며 직접 사용될 수 있습니다. 글로벌은 먼저 선언 한 다음 사용해야합니다. 3. $ Globals는 $ Global [$ varname]과 같은 동적 액세스를 지원합니다. Global은 동적 선언을 지원하지 않습니다. 4.unset ($ global [ 'var'])은 글로벌 변수 자체를 삭제하고 Unset ($ var)은 Global $ V에 있습니다.

$ globals를 사용하면 숨겨진 종속성이 도입되어 테스트, 혼란스러운 설정, 격리가 열악하고 시뮬레이션하기가 어렵 기 때문에 단위 테스트가 파괴됩니다. 2. 솔루션은 다음과 같습니다. 먼저 저장 한 다음 오염을 피하기 위해 글로벌 상태를 복원합니다. 3. $ Globals Access를 서비스 클래스에 캡슐화하고 종속성 주입을 통해 전달하여 테스트에서 Mock Object를보다 쉽게 사용할 수 있습니다. 4. 가벼운 의존성 주입조차도 테스트 성을 크게 향상시킬 수 있으며 글로벌 변수를 직접 읽는 것을 피해야합니다. 5. 미래의 문제를 방지하려면 $ global이 비활성화되어야하며 구성 객체를 대신 사용해야하며, 대신 의존성 주입 컨테이너 또는 환경 변수를 사용해야하며, 정적 분석 도구를 사용하여 고혈당 변수를 감지해야합니다. 최종 답변은 다음과 같습니다. $ Global에 대한 의존성은 캡슐화 및 종속성 주입을 통해 점차적으로 제거해야합니다.

$ globalsmaybeaccepableInlegacysystems likewordpluginswhereItensurescompatibity, 2.itcanbeusedtemporallyBootStrappingBeforedectionEnciorInSavailable, 3.itissuitable-onlyDebuggingToolSindeAndevelopmentenvents.despitetHesec

ModernPrameworkslikelaravelandsymfonyedenceenceNectioninection -decuredectiontoelinaterelianceon $ globalsinceptenciledenciledencilectally, testability 및 rupplicationStateIsNowmanagedTrroughStructuredSolutionsSuchasconFigUrationServices, r
