많은 소스에 따르면 register_globals (전역 변수)는 php.ini에서 사용할 수 없도록 설정해야합니다. 내 코드에 define()을 작성하고 전역 변수가 비활성화 된 경우 상수를 사용해야합니까? 그것들은 심지어 관련이 있습니까?PHP - 전역 변수와 상수의 차이점
답변
그들은 전역 범위를 가지고 있다는 점에서 관련이 있습니다. 그러나 상수는 페이지가 따라갈 때 수정할 수있는 전역 변수와 달리 일단 정의되면 변경되지 않기위한 것입니다. 그래서 global 대신에 define()을 사용하는 것으로 전환하는 것은별로 도움이되지 않습니다.
매개 변수로 변수를 가져 오는 방법을 리팩터링하고 변수를 전달하는 데 의존하는 것이 좋습니다.
여기 몇 가지가 있습니다.
먼저 php.ini에서 비활성화 한 register_globals는 쿼리 문자열 (GET) 또는 양식 (GET/POST)을 통해 전송 된 모든 변수가 글로벌 PHP 변수로 변환되는 기존 PHP 기능을 나타냅니다. 이것은 register_globals를 해제 할 때 비활성화되는 기능입니다. 이 기능을 사용하지 않아도 응용 프로그램에서 전역 변수를 정의 할 수 있습니다.
일반적으로 프로그래밍 용어로 전역 변수 (PHP의 register_globals가 아닌)는 "나쁜"것으로 간주됩니다. 프로그래머 중 하나와 만났을 때 응용 프로그램의 다른 부분이 어떤 부분을 사용하거나 변경했는지, 해당 글로벌에 대한 변경 사항이있을 수 있습니다. 또한 새 전역 변수를 정의하는 경우 다른 사람이 의존하는 기존 변수를 덮어 쓸 가능성이 있습니다. 변수가 로컬로 정의되면 (단일 함수 또는 다른 언어의 단일 블록에서) 로컬 범위를 검사하고 해당 변수의 변경 사항을 결정할 수 있습니다.
상수는 변경되지 않습니다. 한 번 정의하면 정의 된 상태로 유지되며 아무도 변경할 수 없습니다. 그렇기 때문에 전역 상수를 갖는 것보다 전역 변수를 갖는 것이 "덜 나쁘다"고 간주되는 것입니다.
전역 변수는 상수가 아닙니다. (전역 변수의 값을 변경할 수 있지만 한 번만 상수를 정의 할 수 있습니다).
상수는 항상 글로벌이 아닙니다. (클래스에서 상수를 선언 할 수 있음).
또한 전역 변수는 스칼라, 배열 또는 개체 일 수 있습니다. 상수는 스칼라 만 사용할 수 있습니다.
상수 또는 전역이 좋거나 나쁘다고 말할 수 없습니다. 적절하게 사용되면 둘 다 유익한 용도로 사용됩니다. register_globals
기능과 관련된 보안 문제는보다 일반적인 전역 사용과 별개입니다.
일부 일정 예 :
<?php
// Certainly constant
define('MINUTES_PER_HOUR', 60);
define('DOZEN', 12);
// Constant, but specific to this application
define('GREETING', 'Dear %s');
define('TIMEOUT', 30);
// Configurable, but constant for this installation
define('DATABASE', 'mydb');
define('IMAGES_DIRECTORY', '/tmp/images');
// Not constant, or some other reason why can't be constant
$user = $_POST['userid'];
$days_of_week = array('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su');
?>
이 간단한 테스트를 해보십시오 :
fileA.php :
<?php
define('SOMEVAL', 2);
?>
fileB.php :
<?php
if(defined('SOMEVAL')) echo SOMEVAL;
else echo "SOMEVAL does not exists\n";
include 'fileA.php';
if(defined('SOMEVAL')) echo 'SOMEVAL='.SOMEVAL;
else echo "SOMEVAL does not exists\n";
?>
그런 다음 fileB를 실행합니다. PHP를 볼 수 있습니다 전에 내가 fileA.php를 제외하고 SOMEVAL이 정의되지 않았습니다. 이것이 의미하는 바는 아무것도 정의하기 전에 스크립트에서 볼 수 없게된다는 것입니다.
다른 무엇인가 고려해야 할 사항 - 상수는 배열이나 객체와 같은 것을 저장할 수 없지만 $ GLOBALS에 정의 된 것은 임의의 변수 유형이 될 수 있습니다. 따라서 어떤 경우 전역 변수가 필요하지만 define()을 사용하여 상수에 저장할 수없는 경우 대신 $ GLOBALS를 사용하는 것이 좋습니다.
또한 register_globals와 $ GLOBALS는 같은 것이 아닙니다!
로컬 변수가 전역 변수를 무시하지만 전역 변수 outside.inister의 값을 변경하지 않기 때문에 두 변수가 모두 같은 이름 인 경우 전역 변수를 변경할 수 있습니다. 다른 변수에서 같은 이름의 변수를 사용하려는 경우 함수는 한 번 정의하고 모든 프로그램에서 사용하며 어떤 함수 나 블록에서이 변수의 값을 변경할 수 없기 때문에 사용자에게 허용되지 않고 오류가 발생합니다.
- 1. 전역 변수와 파이썬 스레딩
- 2. PHP 상수의 정의 찾기
- 3. PHP는 전역 변수와 폼 요청에 대해 질문합니다.
- 4. 클래스의 필드가 전역 변수와 비슷하지 않습니까?
- 5. jsp 전역 변수와 매개 변수 범위
- 6. 왜 전역 변수와 this.something 변수가 decleared되지 않습니까?
- 7. ActionScript의 정적 변수와 Java EE의 차이점
- 8. bash의 비 설정 변수와 빈 변수의 차이점
- 9. 루비의 로컬 변수와 인스턴스 변수의 차이점
- 10. PHP 변수와 세션 문제
- 11. C에서 리터럴 및 기호 상수의 차이점 및 정의?
- 12. PHP 변수와 문자열 리터럴의 조합
- 13. PHP : 배열 값을 변수와 연결하기
- 14. 변수와 함께 보내는 PHP 폼
- 15. 정의되지 않은 상수의 사용
- 16. PHP 전역 선언
- 17. PHP 재귀 전역 변수?
- 18. PHP 전역 경로 설정
- 19. PHP 차이점 표시
- 20. 셔플과 array_rand의 PHP 차이점
- 21. 쉘 환경 변수에 대한 전역 변수와 로컬 변수의 정적 변수
- 22. PHP의 전역 변수와 함수 매개 변수의 장점/단점은 무엇입니까?
- 23. PHP 전역 변수 수정자가 작동하지 않습니다.
- 24. 정적 변수와 멀티 스레딩
- 25. 왜 전역 구조의 메모리와 (같은 유형의) 멤버 변수가 전역 변수와 같게 설정 되었습니까?
- 26. PHP 5.3.2와 PHP 5.2.1의 preg_match 차이점
- 27. 안드로이드의 일부 페인트 상수의 의미
- 28. PHP 전역 변수에 액세스하기위한 메소드
- 29. PHP - 상수/전역 변수/구성
- 30. PHP 모든 함수 변수 전역
전역 적이며 액세스가 가능한 디렉토리 이름과 같은 사전 설정 변수가 필요합니다. 또한 전역 변수를 사용하지 못하게하려고합니다. 이 경우 define()을 사용할 수 있습니까? – Gal
페이지가 실행될 때 변수를 수정하지 않으려는 경우 yes를 사용하는 것이 적절합니다. – Parrots
@Gal, 예, 런타임에 디렉토리를 변경하지 않으므로 사용하는 것이 좋습니다. – GSto