문제

PHP의 전역 변수에 문제가 있습니다.나는 $screen var가 하나의 파일에 설정되어 있으며 이를 호출하는 다른 파일이 필요합니다. initSession() 또 다른 파일에 정의되어 있습니다.그만큼 initSession() 선언하다 global $screen 그런 다음 첫 번째 스크립트에 설정된 값을 사용하여 $screen을 더 아래로 처리합니다.

이것이 어떻게 가능한지?

상황을 더 혼란스럽게 만들기 위해 $screen을 다시 설정하려고 하면 다음을 호출합니다. initSession(), 처음에 사용한 값을 다시 한 번 사용합니다.다음 코드에서는 프로세스를 설명합니다.누군가 이것을 설명해 줄 수 있습니까?

$screen = "list1.inc";            // From model.php
require "controller.php";         // From model.php
initSession();                    // From controller.php
global $screen;                   // From Include.Session.inc  
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc";          // From model2.php
require "controller2.php"         
initSession();
global $screen;
echo $screen; // prints "list1.inc" 

업데이트:
내가 선언하면 $screen 두 번째 모델을 요구하기 직전에 다시 전역적으로 $screen이 올바르게 업데이트됩니다. initSession() 방법.이상한.

도움이 되었습니까?

해결책

Global 변수를 전역으로 만들지 않습니다.나는 그것이 까다롭다는 것을 안다 :-)

Global 지역 변수가 사용될 것이라고 말합니다 마치 더 높은 범위의 변수인 것처럼.

예:

<?php

$var = "test"; // this is accessible in all the rest of the code, even an included one

function foo2()
{
    global $var;
    echo $var; // this print "test"
    $var = 'test2';
}

global $var; // this is totally useless, unless this file is included inside a class or function

function foo()
{
    echo $var; // this print nothing, you are using a local var
    $var = 'test3';
}

foo();
foo2();
echo $var;  // this will print 'test2'
?>

전역 변수는 좋은 생각이 아닌 경우가 많습니다.그것들 없이도 99.99999%의 시간을 코딩할 수 있으며 퍼지 범위가 없으면 코드를 유지 관리하기가 훨씬 쉽습니다.피하다 global 할 수 있다면.

다른 팁

global $foo "모든 사람이 사용할 수 있도록 이 변수를 전역 변수로 만든다"는 의미는 아닙니다. global $foo 수단 "이 기능의 범위 내에서, 전역 변수를 사용하십시오 $foo".

귀하의 예를 통해 매번 함수 내에서 $screen을 참조하고 있다고 가정합니다.그렇다면 다음을 사용해야 합니다. global $screen 각 기능에서.

각 파일의 상단뿐만 아니라 이를 참조하는 모든 함수에 "global $screen"을 넣어야 합니다.

많은 함수를 사용하는 작업 중에 액세스하려는 변수가 많으면 해당 항목을 담을 '컨텍스트' 객체를 만드는 것을 고려해보세요.

//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();

doFoo($fooContext);

이제 이 객체를 모든 함수에 매개변수로 전달하면 됩니다.전역 변수가 필요하지 않으며 함수 서명이 깨끗하게 유지됩니다.나중에 빈 StdClass를 실제로 관련 메서드가 있는 클래스로 바꾸는 것도 쉽습니다.

전역 범위는 포함된 파일과 필수 파일에 걸쳐 있으므로 함수 내에서 변수를 사용하지 않는 한 전역 키워드를 사용할 필요가 없습니다.대신 $GLOBALS 배열을 사용해 볼 수 있습니다.

값을 정의하기 전에 변수를 전역으로 선언해야 합니다.

함수나 클래스에 들어가기 전까지는 쓸모가 없습니다.전역이란 프로그램의 모든 부분에서 변수를 사용할 수 있음을 의미합니다.따라서 전역이 함수나 클래스에 포함되어 있지 않으면 전역을 사용할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top