2013-08-28 5 views
0

PHP에서 변수 범위 지정에 문제가 있습니다. 다음은 내 코드의 구조입니다.PHP 변수 범위 지정

<?php 
$loader = new ELLoad(); 
$sessionid = ''; 
$method = $_REQUEST['m']; 
if (strcasecmp($method, "getfile") == 0) { 
    global $loader; 
    $loader->load($file['text']); 
    global $sessionid; 
    $sessionid = $loader->getSessionId(); 
} 
if (strcasecmp($method, "extract") == 0) { 
    $extractor = new ELExtract(); 
    global $sessionid; 
    $extractor->extract($sessionid); //$session id for some reason is still ' ' here 
} 

클라이언트의 요청 시퀀스에는 항상로드가 이어지고 추출됩니다. 누구나 내 $ sessionid 변수가 제대로 업데이트되지 않을 수 있다고 말할 수 있습니까?

+2

'if' 문에서'global'을하지 않아도되고,'function' 호출 내에서만'global'을 사용할 필요가 없습니다. 그와'글로벌'은 나쁜 습관으로 간주됩니다. – Halcyon

+0

처음에'global'을 사용하는 이유는 무엇입니까? 변수가 함수 내에 있지 않으면 변수가 전역 범위에 있습니다. –

+0

여기에'global' 키워드를 사용할 필요가 없습니다. 이 키워드는 사용자가 예를 들어 안에있을 때 사용됩니다. '함수'. – hallaji

답변

0

기능을 사용하지 않는 한 global $...을 신고 할 필요가 없습니다. 블록 (if, while, ...)은 직전의 행과 동일한 범위를가집니다. == 그것은 first condition 경우 변경되지 있기 때문에,

<?php 
session_start(); 
$loader = new ELLoad(); 
$_SESSION['id'] = ''; 
$method = $_REQUEST['m']; 
if (strcasecmp($method, "getfile") == 0) { 
    $loader->load($file['text']); 
    $_SESSION['id'] = $loader->getSessionId(); 
} 
if (strcasecmp($method, "extract") == 0) { 
    $extractor = new ELExtract(); 
    $extractor->extract($_SESSION['id']); //$session id for some reason is still ' ' here 
} 
1

$sessionid 여전히 ''입니다 :

난 당신이 뭘 원하는지 모르겠지만, 당신은 같은 실제 세션에서 당신에게 $sessionid 컨텐츠를 계속해야 코드의 false

개선 :

$loader = new ELLoad(); 
$sessionid = $loader->getSessionId(); 
$method = $_REQUEST['m']; 
if (strcasecmp($method, "getfile") == 0) { 
    $loader->load($file['text']); 
    // do more stuff 
} 
else if (strcasecmp($method, "extract") == 0) { 
    $extractor = new ELExtract(); 
    $extractor->extract($sessionid); 
    // do more stuff 
} 

또한 $_REQUEST 대신에 $_GET 또는 $_POST을 사용하는 것이 좋으며, 마지막으로 else if을 별도의 반복 된 조건으로 사용하는 것이 좋습니다.