새로운 대규모 PHP 프로그램을 개발하더라도 일부 데이터는 코드의 다른 부분에서 사용되기 때문에 필연적으로 전역 데이터를 사용하게 됩니다. 일반적인 전역 데이터에는 프로그램 설정 클래스, 데이터베이스 연결 클래스, 사용자 정보 등이 포함됩니다. 이 데이터를 전역 데이터로 만드는 방법에는 여러 가지가 있습니다. 그 중 가장 일반적으로 사용되는 방법은 "global" 키워드 선언을 사용하는 것입니다. 이에 대해서는 이 기사의 뒷부분에서 자세히 설명하겠습니다.
전역 데이터를 선언하기 위해 "global" 키워드를 사용하는 경우의 유일한 단점은 실제로 프로그래밍 방식이 매우 좋지 않으며 전역 데이터가 코드 세그먼트를 모두 연결하기 때문에 나중에 프로그램에서 더 큰 문제를 초래한다는 것입니다. 따라서 코드의 한 부분을 변경하면 다른 부분이 잘못될 수 있습니다. 따라서 코드에 전역 변수가 많으면 전체 프로그램을 유지 관리하기가 어려워집니다.
이 기사에서는 다양한 기술이나 디자인 패턴을 통해 이러한 전역 변수 문제를 방지하는 방법을 보여줍니다. 물론, 먼저 전역 데이터에 "global" 키워드를 사용하는 방법과 작동 방식을 살펴보겠습니다. 전역 변수와 "global" 키워드 사용
PHP는 기본적으로 일부 "Superglobals" 변수를 정의합니다. 이러한 변수는 자동으로 전역화되며 $_GET 및 $_REQUEST 등과 같이 프로그램의 어느 곳에서나 호출될 수 있습니다. 일반적으로 데이터나 기타 외부 데이터에서 가져오며 이러한 변수를 사용해도 기본적으로 쓰기가 불가능하므로 일반적으로 문제가 발생하지 않습니다.
그러나 자신만의 전역 변수를 사용할 수 있습니다. "global" 키워드를 사용하면 전역 데이터를 함수의 로컬 범위로 가져올 수 있습니다. "가변 사용 범위"를 이해하지 못하는 경우 PHP 매뉴얼의 관련 지침을 참조하세요.
다음은 "global" 키워드를 사용한 데모 예시입니다.
인용된 내용은 다음과 같습니다.
<?php
$my_var = '안녕하세요 월드';
테스트_글로벌();
함수 test_global() {
// 이제 로컬 범위에 있습니다.
// $my_var 변수가 존재하지 않습니다.
// 오류 발생: "정의되지 않은 변수: my_var"
에코 $my_var;
// 이제 변수를 중요하게 보겠습니다.
글로벌 $my_var;
// 작동:
에코 $my_var;
}
?>
위의 예에서 볼 수 있듯이 "global" 키워드는 전역 변수를 가져오는 데 사용됩니다. 잘 작동하고 간단한 것처럼 보이는데, 글로벌 데이터를 정의하기 위해 "global" 키워드를 사용하는 것에 대해 왜 걱정합니까?
세 가지 좋은 이유는 다음과 같습니다.
1. 코드 재사용이 거의 불가능합니다.
함수가 전역 변수에 의존하는 경우 이 함수를 다른 환경에서 사용하는 것은 거의 불가능합니다. 또 다른 문제는 이 함수를 추출하여 다른 코드에서 사용할 수 없다는 것입니다.
2. 문제를 디버깅하고 해결하는 것은
전역 변수를 추적하는 것이 비전역 변수를 추적하는 것보다 훨씬 어렵습니다. 일부 모호한 포함 파일에서 전역 변수가 재정의될 수 있으며, 도움을 줄 수 있는 아주 좋은 프로그램 편집기(또는 IDE)가 있더라도 문제를 발견하는 데 몇 시간이 걸릴 수 있습니다.
3. 이러한 코드를 이해하는 것은 매우 어려울 것입니다.
전역 변수가 어디서 왔는지, 무엇을 위해 사용되는지 파악하는 것은 어렵습니다. 개발 과정에서는 전역 변수를 모두 알게 되지만, 1년쯤 지나면 그 중 일부는 잊어버리게 될 수도 있습니다. 이때 전역 변수를 너무 많이 사용했다는 사실을 후회하게 될 것입니다.
그렇다면 전역 변수를 사용하지 않으면 무엇을 사용합니까? 아래에서 몇 가지 해결 방법을 살펴보겠습니다.
함수 매개변수 사용
전역 변수 사용을 중단하는 한 가지 방법은 아래와 같이 변수를 함수에 매개변수로 전달하는 것입니다.
다음은 인용문의 내용입니다.
<?php
$var = '안녕하세요';
테스트($var);
함수 테스트($var) {
에코 $var;
}
?>
전역 변수만 전달하면 되는 경우 이는 매우 훌륭하거나 뛰어난 솔루션이지만 많은 값을 전달하려는 경우에는 어떻게 될까요?
예를 들어 데이터베이스 클래스, 프로그램 설정 클래스 및 사용자 클래스를 사용한다고 가정해 보겠습니다. 우리 코드에서는 이 세 가지 클래스가 모든 구성 요소에 사용되므로 각 구성 요소에 전달해야 합니다. 함수 매개변수 방법을 사용하는 경우 다음을 수행해야 합니다.
다음은 인용된 내용입니다.
<?php
$db = 새로운 DBConnection;
$settings = 새로운 설정_XML;
$user = 새로운 사용자;
테스트($db, $settings, $user);
함수 테스트(&$db, &$settings, &$user) {
// 뭔가를 해라
}
?>
분명히 이것은 가치가 없으며 추가할 새 개체가 있으면 각 함수에 함수 매개 변수를 하나 더 추가해야 합니다. 그래서 우리는 이 문제를 해결하기 위해 다른 방법을 사용해야 합니다.