source

PHP의 글로벌 변수는 나쁜 관행으로 간주됩니까?그렇다면 왜?

factcode 2022. 9. 25. 00:14
반응형

PHP의 글로벌 변수는 나쁜 관행으로 간주됩니까?그렇다면 왜?

function foo () {
    global $var;
    // rest of code
}

제 작은 PHP 프로젝트에서는 보통 절차를 따릅니다.으로 시스템에서 이 에 액세스하기 이 변수를 합니다.global $var;.

이게 나쁜 관행인가요?

사람들이 다른 언어로 글로벌 변수에 대해 말할 때, 그것은 PHP에서 하는 것과 다른 것을 의미합니다.PHP에서는 변수가 글로벌하지 않기 때문입니다.일반적인 PHP 프로그램의 범위는 하나의 HTTP 요청입니다.세션 변수는 일반적으로 많은 HTTP 요청을 포함하므로 실제로 PHP "글로벌" 변수보다 범위가 넓습니다.

, 하다, 하다, 하다, 하다, 하다 등의 방법으로 부를 수 .preg_replace_callback()음음음같 뭇매하다

preg_replace_callback('!pattern!', array($obj, 'method'), $str);

자세한 내용은 콜백을 참조하십시오.

요점은 오브젝트가 PHP에 볼트로 고정되어 있고 어떤 면에서는 어색함을 유발한다는 것입니다.

다른 언어의 표준이나 구조를 PHP에 적용하는 것에 지나치게 신경 쓰지 마세요.또 다른 일반적인 함정은 객체 모델을 모든 것 위에 붙임으로써 PHP를 순수한 OOP 언어로 바꾸려고 하는 것이다.

다른 어떤 것과 마찬가지로 "글로벌" 변수, 절차 코드, 특정 프레임워크 및 OOP를 사용합니다.그것은 타당하고, 문제를 해결하고, 작성해야 하는 코드의 양을 줄이거나, 보다 유지보수가 용이하고 이해하기 쉽게 하기 때문입니다.

글로벌 변수를 주의 깊게 사용하지 않으면 문제를 찾기 어려울 수 있습니다.예를 들어 php 스크립트를 요청하면 일부 함수에 존재하지 않는 배열의 인덱스에 액세스하려고 한다는 경고가 표시됩니다.

액세스하려는 어레이가 함수에 로컬인 경우 함수에 오류가 없는지 확인합니다.함수에 대한 입력에 문제가 있을 수 있으므로 함수가 호출되는 위치를 확인합니다.

그러나 해당 배열이 글로벌한 경우 해당 글로벌 변수를 사용하는 모든 위치를 확인해야 합니다. 뿐만 아니라 글로벌 변수에 대한 참조가 어떤 순서로 액세스되는지 파악해야 합니다.

코드 조각에 글로벌 변수가 있는 경우 해당 코드의 기능을 분리하기가 어렵습니다.기능을 분리하는 이유는 무엇입니까?테스트하여 다른 곳에서 재사용할 수 있습니다.테스트할 필요가 없고 재사용할 필요가 없는 코드가 있는 경우 글로벌 변수를 사용하는 것이 좋습니다.

인정된 답변에 동의합니다.두 가지를 덧붙이겠습니다.

  1. 프레픽스를 사용하여 즉시 글로벌하게 식별할 수 있도록 합니다(예: $g_).

  2. 코드 주위에 흩뿌리지 말고 한 곳에 두라고 선언해

종료된 SO Documentation 베타에서 다시 게시.

다음 의사 코드로 이 문제를 설명할 수 있습니다.

function foo() {
     global $bob;
     $bob->doSomething();
}

첫 번째 질문은 명백한 질문입니다.

?$bob★★★★★★★★★★★★★★★★★?

신은은? 츠요시 이라면 다음 는 의 모든 입니다.$bob는 더 요.$bob어디에나 사용됩니다). 나쁜 것은 다른 더 나쁜 것은 없다.$bob(또는 해당 변수를 잊어버리고 재사용한 경우) 코드가 끊어질 수 있습니다(위의 코드 예에서는 잘못된 오브젝트가 있거나 오브젝트가 전혀 없는 경우 치명적인 오류가 발생합니다).이 PHP와 같은 include('file.php');파일을 추가할수록 코드 관리가 기하급수적으로 어려워집니다.

어떻게 하면 지구전을 피할 수 있을까?

지구촌을 피하는 가장 좋은 방법은 의존성 주입이라는 철학이다.여기서 필요한 도구를 함수 또는 클래스에 전달합니다.

function foo(\Bar $bob) {
    $bob->doSomething();
}

이것은 훨씬 더 쉽게 이해하고 유지할 수 있습니다.어디인지 짐작할 수 없다$bob는, 발신자가 그것을 알 책임이 있기 때문에 설정되어 있습니다(필요한 것을 전달하고 있습니다).또한 형식 선언을 사용하여 전달되는 내용을 제한할 수 있습니다.그래서 우리는 그것을 안다.$bob는 의 인스턴스 중 하나입니다.Bar 또는 """Bar즉, 그 클래스의 메서드를 사용할 수 있습니다. 5.3 이용 와하면, 「PHP 5.3」(PHP 5.3)의 장소를 할 수 .Bar정의되어 있습니다..0 선언이 PHP 7.0 등)도할 수 .int ★★★★★★★★★★★★★★★★★」string를 참조해 주세요.

경험, 대학 학위, 소프트웨어 공학에 대해 누가 이의를 제기할 수 있습니까?내가 아니다.오브젝트 지향의 싱글 페이지 PHP 애플리케이션을 개발하는데 있어서, 이름 공간 충돌에 대한 걱정 없이 처음부터 모든 것을 구축할 수 있다는 것을 알게 되면, 더 즐겁다고 밖에 말할 수 없습니다.처음부터 짓는 것은 많은 사람들이 더 이상 하지 않는 것이다.그들은 신경 써야 할 직업, 마감일, 보너스 또는 평판을 가지고 있다.이러한 유형의 경우 사전 빌드된 코드 중 많은 코드를 사용하기 때문에 글로벌 변수를 사용할 위험이 전혀 없습니다.

비록 프로그램의 글로벌 영역에서만 사용되더라도 글로벌 변수를 사용하는 것은 나쁠 수 있지만, 단지 즐기고 무언가를 작동시키고 싶어하는 사람들을 잊지 말자.

글로벌 네임스페이스에서 몇 개의 변수(< 10)를 사용하는 경우, 프로그램의 글로벌 영역에서만 사용됩니다.그래, 그래, MVC, 의존성 주입, 외부 코드, blah, blah, blah, blah, blah, blah, blah.그러나 코드의 99.99%를 네임스페이스와 클래스에 포함시키고 외부 코드가 샌드박스에 포함된 경우 글로벌 변수를 사용하면 월드가 종료되지 않습니다(반복합니다.월드는 종료되지 않습니다).

일반적으로 글로벌 변수를 사용하는 것이 나쁜 관행이라고는 말할 수 없습니다.프로그램의 글로벌 영역 밖에서 글로벌 변수(플래그 등)를 사용하는 것은 문제를 초래하는 것이며, 그 상태를 쉽게 파악할 수 없기 때문에 (장기적으로는) 현명하지 못한 행동이라고 생각합니다.또, 글로벌 변수의 사용에 관한 버그를 추적하는 「즐거움」을 경험하게 되므로, 보다 많은 것을 배울수록 글로벌 변수에 대한 의존도가 낮아집니다.이것만으로도 같은 문제를 해결할 수 있는 다른 방법을 찾을 수 있습니다.공교롭게도, 이것은 PHP 유저에게 네임스페이스나 클래스(스태틱 멤버 등)의 사용법을 배우도록 강요하는 경향이 있다.

컴퓨터 공학 분야는 넓다.만약 우리가 나쁜 라벨이라고 해서 모든 사람들이 그것을 하지 못하도록 겁을 준다면, 그들은 라벨 뒤에 있는 이유를 진정으로 이해하는 재미를 잃게 될 것이다.

필요한 경우 전역 변수를 사용하되 전역 변수 없이도 문제를 해결할 수 있는지 확인하십시오.충돌, 테스트 및 디버깅은 단순히 문제를 설명하는 것이 아니라 문제의 본질을 잘 이해해야 더 큰 의미가 있습니다.

예를 들면:

global $my_global; 
$my_global = 'Transport me between functions';
Equals $GLOBALS['my_global']

잘못된 관행입니다(Wordpress 등).$pagenow)...흠

이 점을 고려하면:

$my-global = 'Transport me between functions';

PHP 오류입니다만:

$GLOBALS['my-global'] = 'Transport me between functions';

에러가 아닙니다.하이픈은 다음과 같은 "공통" 사용자 지정 변수와 충돌하지 않습니다.$pagenow대문자 사용은 슈퍼글로벌 사용, 코드 내 발견, 파일 내 검색 등을 의미합니다.

단일 솔루션에 대한 모든 클래스의 작성을 게을리하면 다음과 같은 하이픈을 사용합니다.

$GLOBALS['PREFIX-MY-GLOBAL'] = 'Transport me ... ';

그러나 더 널리 사용되는 경우에는 하나의 글로벌을 배열로 사용합니다.

$GLOBALS['PREFIX-MY-GLOBAL']['context-something'] = 'Transport me ... ';
$GLOBALS['PREFIX-MY-GLOBAL']['context-something-else']['numbers'][] = 'Transport me ... ';

후자는 데이터를 캐싱하기 위해 매번 싱글톤 클래스로 어수선한 것이 아니라 "콜라 라이트" 목표나 사용에 대한 좋은 관행입니다.제가 틀렸거나 바보 같은 걸 놓쳤다면 댓글로 남겨주세요.

언급URL : https://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice-if-so-why

반응형