>  기사  >  백엔드 개발  >  PHP 변수 범위

PHP 변수 범위

伊谢尔伦
伊谢尔伦원래의
2016-11-24 13:47:081363검색

변수의 범위는 변수가 정의된 컨텍스트(즉, 유효 범위)입니다. 대부분의 PHP 변수에는 단일 범위만 있습니다. 이 단일 범위 범위에는 include 및 require 에 의해 도입된 파일도 포함됩니다. 예:

<?php
    $a = 1;
    include &#39;b.inc&#39;;
?>

여기서 $a 변수는 포함 파일 b.inc에 적용됩니다. 그러나 사용자 정의 함수에는 로컬 함수 범위가 도입됩니다. 함수 내에서 사용되는 모든 변수는 기본적으로 로컬 함수 범위로 제한됩니다. 예:

<?php
    $a = 1; /* global scope */
    function Test()
    {
        echo $a; /* reference to local scope variable */
    }
    Test();
?>

echo 문이 변수 $a의 로컬 버전을 참조하고 이 범위 내의 값이 할당되지 않았기 때문에 이 스크립트는 출력을 생성하지 않습니다. PHP의 전역 변수는 C 언어와 약간 다르다는 것을 알 수 있습니다. C 언어에서 전역 변수는 로컬 변수에 의해 재정의되지 않는 한 자동으로 함수에 적용됩니다. 이로 인해 일부 문제가 발생할 수 있으며 누군가 실수로 전역 변수를 변경할 수도 있습니다. PHP의 전역 변수는 함수에서 사용될 때 전역으로 선언되어야 합니다.

global 키워드

먼저 global 사용 예:

예제 #1 global 사용

<?php
    $a = 1;
    $b = 2;
    function Sum()
    {
        global $a, $b;
        $b = $a + $b;
    }
    Sum();
    echo $b;
?>

위 스크립트의 출력은 다음과 같습니다. " 3". 전역 변수 $a 및 $b가 함수에서 선언된 후 두 변수에 대한 모든 참조는 해당 전역 버전을 가리킵니다. PHP는 함수가 선언할 수 있는 전역 변수의 최대 개수에 제한이 없습니다.

전역 범위의 변수에 액세스하는 두 번째 방법은 특별한 PHP 사용자 정의 $GLOBALS 배열을 사용하는 것입니다. 이전 예는 다음과 같이 작성할 수 있습니다.

예 #2 전역 대신 $GLOBALS 사용

<?php
    $a = 1;
    $b = 2;
    function Sum()
    {
        $GLOBALS[&#39;b&#39;] = $GLOBALS[&#39;a&#39;] + $GLOBALS[&#39;b&#39;];
    }
    Sum();
    echo $b;
?>

$GLOBALS는 연관 배열이고, 각 변수는 요소이며, 키 이름은 다음에 해당합니다. 변수 이름, 값 해당 변수의 내용. $GLOBALS는 슈퍼전역 변수이기 때문에 $GLOBALS는 전역 범위에 존재합니다. 다음 예에서는 슈퍼 전역 변수의 사용을 보여줍니다.

예 #3 슈퍼 전역 변수 및 범위를 보여주는 예

<?php
    function test_global()
    {
        // 大多数的预定义变量并不 "super",它们需要用 &#39;global&#39; 关键字来使它们在函数的本地区域中有效。
        global $HTTP_POST_VARS;
        echo $HTTP_POST_VARS[&#39;name&#39;];
        // Superglobals 在任何范围内都有效,它们并不需要 &#39;global&#39; 声明。Superglobals 是在 PHP 4.1.0 引入的。
        echo $_POST[&#39;name&#39;];
    }
?>

정적 변수 사용

또 다른 변수 범위 중요한 기능은 다음과 같습니다. 정적 변수. 정적 변수는 로컬 함수 범위에만 존재하지만 프로그램 실행이 이 범위를 벗어나도 해당 값은 손실되지 않습니다. 다음 예를 살펴보십시오.

예제 #4 정적 변수가 필요한 예를 보여줍니다.

<?php
    function Test()
    {
        $a = 0;
        echo $a;
        $a++;
    }
?>

이 함수는 호출될 때마다 $a의 값이 다음과 같기 때문에 쓸모가 없습니다. 0으로 설정하고 출력을 0으로 설정합니다. 변수를 1씩 증가시키는 $a++는 함수가 종료되면 변수 $a가 더 이상 존재하지 않기 때문에 아무런 효과가 없습니다. 현재 카운트 값을 잃지 않는 카운팅 함수를 작성하려면 $a 변수를 정적으로 정의하십시오.

예제 #5 정적 변수 사용 예

<?php
    function test()
    {
        static $a = 0;
        echo $a;
        $a++;
    }
?>

이제 변수 $ a는 test() 함수가 처음 호출될 때만 초기화되며, test() 함수에 대한 각 후속 호출은 $a 값을 출력하고 1씩 증가시킵니다.

정적 변수는 재귀 함수를 처리하는 방법도 제공합니다. 재귀 함수는 자기 자신을 호출하는 함수입니다. 재귀 함수를 작성할 때는 무기한 재귀될 수 있으므로 주의하세요. 재귀를 종료하는 적절한 방법이 있는지 확인해야 합니다. 다음의 간단한 함수는 정지 시점을 결정하기 위해 정적 변수 $count를 사용하여 10까지 재귀적으로 계산합니다.

예제 #6 정적 변수 및 재귀 함수

<?php
    function test()
    {
        static $count = 0;
        $count++;
        echo $count;
        if ($count < 10) {
            test();
        }
        $count--;
    }
?>

정적 변수는 다음과 같이 사용할 수 있습니다. 위의 예시문. 선언의 표현식 결과와 함께 이를 할당하면 구문 분석 오류가 발생합니다.

예제 #7 정적 변수 선언

<?php
    function foo(){
        static $int = 0; // correct
        static $int = 1+2; // wrong (as it is an expression)
        static $int = sqrt(121); // wrong (as it is an expression too)
        $int++;
        echo $int;
    }
?>

정적 선언은 컴파일 타임에 해결됩니다.

함수 외부에서 전역 키워드를 사용해도 문제가 없습니다. 함수 내에 파일을 포함할 때 사용할 수 있습니다.

전역 및 정적 변수의 참조

PHP4를 구동하는 Zend 엔진 1세대에서는 변수의 정적 및 전역 정의가 참조 형식으로 구현됩니다. 예를 들어, 함수 범위 내에서 global 문을 사용하여 가져온 실제 전역 변수는 실제로 전역 변수에 대한 참조를 설정합니다. 이로 인해 다음 예에서 설명한 것처럼 예기치 않은 동작이 발생할 수 있습니다.

<?php
    function test_global_ref() {
        global $obj;
        $obj = &new stdclass;
    }
    function test_global_noref() {
        global $obj;
        $obj = new stdclass;
    }
    test_global_ref();
    var_dump($obj);
    test_global_noref();
    var_dump($obj);
?>

위 루틴은 다음을 출력합니다.

NULL
object(stdClass)(0) { }

정적 문에도 비슷한 동작이 적용됩니다. 참조는 정적으로 저장되지 않습니다.

<?php
    function &get_instance_ref() {
        static $obj;
        echo &#39;Static object: &#39;;
        var_dump($obj);
        if (!isset($obj)) {
           // 将一个引用赋值给静态变量
           $obj = &new stdclass;
        }
        $obj->property++;
        return $obj;
    }
    function &get_instance_noref() {
        static $obj;
        echo &#39;Static object: &#39;;
        var_dump($obj);
        if (!isset($obj)) {
            // 将一个对象赋值给静态变量
            $obj = new stdclass;
        }
        $obj->property++;
        return $obj;
    }
    $obj1 = get_instance_ref();
    $still_obj1 = get_instance_ref();
    echo "\n";
    $obj2 = get_instance_noref();
    $still_obj2 = get_instance_noref();
?>

위 루틴은 다음을 출력합니다.

  Static object: NULL
    Static object: NULL
    Static object: NULL
    Static object: object(stdClass)(1) {
        ["property"]=>int(1)
    }

위 예는 정적 변수에 참조를 할당할 때 두 번째로 값이 다음과 같다는 것을 보여줍니다. &get_instance_ref() 함수를 호출할 때 기억되지 않습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 변수 변수다음 기사:PHP 변수 변수