2010-01-13 6 views
7

많은 소스에 따르면 register_globals (전역 변수)는 php.ini에서 사용할 수 없도록 설정해야합니다. 내 코드에 define()을 작성하고 전역 변수가 비활성화 된 경우 상수를 사용해야합니까? 그것들은 심지어 관련이 있습니까?PHP - 전역 변수와 상수의 차이점

답변

15

그들은 전역 범위를 가지고 있다는 점에서 관련이 있습니다. 그러나 상수는 페이지가 따라갈 때 수정할 수있는 전역 변수와 달리 일단 정의되면 변경되지 않기위한 것입니다. 그래서 global 대신에 define()을 사용하는 것으로 전환하는 것은별로 도움이되지 않습니다.

매개 변수로 변수를 가져 오는 방법을 리팩터링하고 변수를 전달하는 데 의존하는 것이 좋습니다.

+0

전역 적이며 액세스가 가능한 디렉토리 이름과 같은 사전 설정 변수가 필요합니다. 또한 전역 변수를 사용하지 못하게하려고합니다. 이 경우 define()을 사용할 수 있습니까? – Gal

+1

페이지가 실행될 때 변수를 수정하지 않으려는 경우 yes를 사용하는 것이 적절합니다. – Parrots

+4

@Gal, 예, 런타임에 디렉토리를 변경하지 않으므로 사용하는 것이 좋습니다. – GSto

2

정의 된 상수는 변경할 수 없습니다.

변수를 변수로 사용하지 마십시오. 함수 내에서 변수를 사용해야하는 경우 함수 자체에 변수를 전달하십시오. 사용 의도대로 모든 것을 사용하십시오. 변수는 이고 변수는이며 상수는 상수는입니다.

+0

디렉터리 이름을 전달할 수 있도록 상수를 사용하고 싶습니다. – Gal

+0

디렉토리 값이 변경 될 것으로 예상되지 않으면, 반드시 모든 상수를 사용하십시오. – Sampson

8

여기 몇 가지가 있습니다.

먼저 php.ini에서 비활성화 한 register_globals는 쿼리 문자열 (GET) 또는 양식 (GET/POST)을 통해 전송 된 모든 변수가 글로벌 PHP 변수로 변환되는 기존 PHP 기능을 나타냅니다. 이것은 register_globals를 해제 할 때 비활성화되는 기능입니다. 이 기능을 사용하지 않아도 응용 프로그램에서 전역 변수를 정의 할 수 있습니다.

일반적으로 프로그래밍 용어로 전역 변수 (PHP의 register_globals가 아닌)는 "나쁜"것으로 간주됩니다. 프로그래머 중 하나와 만났을 때 응용 프로그램의 다른 부분이 어떤 부분을 사용하거나 변경했는지, 해당 글로벌에 대한 변경 사항이있을 수 있습니다. 또한 새 전역 변수를 정의하는 경우 다른 사람이 의존하는 기존 변수를 덮어 쓸 가능성이 있습니다. 변수가 로컬로 정의되면 (단일 함수 또는 다른 언어의 단일 블록에서) 로컬 범위를 검사하고 해당 변수의 변경 사항을 결정할 수 있습니다.

상수는 변경되지 않습니다. 한 번 정의하면 정의 된 상태로 유지되며 아무도 변경할 수 없습니다. 그렇기 때문에 전역 상수를 갖는 것보다 전역 변수를 갖는 것이 "덜 나쁘다"고 간주되는 것입니다.

+0

상수는 여전히 나쁘다. 세션을 사용하여 디렉토리 이름 같은 것을 전달해야합니까? – Gal

+0

상수는 '덜 나쁜'것이 아닙니다. Gal이 디렉터리에 관해 말하는 것과 같이 많은 경우에 사용할 수있는 완벽하게 허용되는 것입니다. – GSto

+0

상수는 괜찮습니다. 글로벌 네임 스페이스에서 상수를 사용해서는 안된다는 설득력있는 주장이 있습니다 (즉, 클래스 상수 만 사용되는 것으로 생각됩니다). 여기에 정답은 없으며, 서로 다른 트레이드 오프를 가진 대답들만 있습니다. –

6

전역 변수는 상수가 아닙니다. (전역 변수의 값을 변경할 수 있지만 한 번만 상수를 정의 할 수 있습니다).

상수는 항상 글로벌이 아닙니다. (클래스에서 상수를 선언 할 수 있음).

또한 전역 변수는 스칼라, 배열 또는 개체 일 수 있습니다. 상수는 스칼라 만 사용할 수 있습니다.

상수 또는 전역이 좋거나 나쁘다고 말할 수 없습니다. 적절하게 사용되면 둘 다 유익한 용도로 사용됩니다. register_globals 기능과 관련된 보안 문제는보다 일반적인 전역 사용과 별개입니다.

1

일부 일정 예 :

<?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'); 

?> 
-1

이 간단한 테스트를 해보십시오 :

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이 정의되지 않았습니다. 이것이 의미하는 바는 아무것도 정의하기 전에 스크립트에서 볼 수 없게된다는 것입니다.

0

다른 무엇인가 고려해야 할 사항 - 상수는 배열이나 객체와 같은 것을 저장할 수 없지만 $ GLOBALS에 정의 된 것은 임의의 변수 유형이 될 수 있습니다. 따라서 어떤 경우 전역 변수가 필요하지만 define()을 사용하여 상수에 저장할 수없는 경우 대신 $ GLOBALS를 사용하는 것이 좋습니다.

또한 register_globals와 $ GLOBALS는 같은 것이 아닙니다!

0

로컬 변수가 전역 변수를 무시하지만 전역 변수 outside.inister의 값을 변경하지 않기 때문에 두 변수가 모두 같은 이름 인 경우 전역 변수를 변경할 수 있습니다. 다른 변수에서 같은 이름의 변수를 사용하려는 경우 함수는 한 번 정의하고 모든 프로그램에서 사용하며 어떤 함수 나 블록에서이 변수의 값을 변경할 수 없기 때문에 사용자에게 허용되지 않고 오류가 발생합니다.

관련 문제