참고: 변수 범위란 무엇이며, 어떤 변수는 어디에서 접근할 수 있으며, "정의되지 않은 변수" 오류는 무엇입니까?
P粉018653751
P粉018653751 2023-07-23 19:17:03
0
2
584
<p><br /></p><blockquote> <p>참고: 이것은 PHP에서 변수 범위를 처리하기 위한 참조 질문입니다. 이 패턴에 맞는 많은 질문 중 이 질문과 중복되므로 닫으십시오.</p> </인용문> <p>PHP에서 변수 범위는 무엇을 의미하나요? 한 .php 파일의 변수를 다른 파일에서 액세스할 수 있습니까? 가끔 "정의되지 않은 변수" 오류 메시지가 나타나는 이유는 무엇입니까?</p>
P粉018653751
P粉018653751

모든 응답(2)
P粉786432579

함수 범위 내에 정의된 변수는 외부에서 접근할 수 없지만, 함수가 완료된 후에 해당 값을 사용할 수 없다는 의미는 아닙니다. PHP에는 객체 지향 PHP에서 정적 메서드와 속성을 정의하는 데 널리 사용되는 잘 알려진 static 키워드가 있지만, static 키워드는 함수 내에서 정적 변수를 정의하는 데에도 사용될 수 있다는 점을 기억해야 합니다.

정적 변수는 프로그램 실행이 범위를 벗어날 때 값을 잃지 않는다는 점에서 함수 범위 내에 정의된 일반 변수와 다릅니다. 정적 변수를 사용하는 다음 예를 살펴보겠습니다.

으아아아

결과:

으아아아

$counter 변수를 정의하기 위해 static 키워드를 사용하지 않았다면 매번 출력되는 값은 함수에 전달된 $num 매개변수와 동일할 것입니다. static 키워드를 사용하면 추가 솔루션 없이도 이 간단한 카운터를 구축할 수 있습니다.

정적 변수의 목적

  1. 연속적인 함수 호출 사이에 값을 저장하는 데 사용됩니다.
  2. 값을 인수로 전달할 방법(또는 목적)이 없는 경우 재귀 호출 간에 값을 저장합니다.
  3. 일반적으로 한 번만 검색하는 것이 가장 좋은 값을 캐싱하는 데 사용됩니다. 예를 들어 서버에서 변경할 수 없는 파일을 읽은 결과입니다.

정적 변수는 로컬 함수 범위에만 존재합니다. 정의된 함수 외부에서는 액세스할 수 없습니다. 따라서 다음에 함수가 호출될 때까지 해당 값이 변경되지 않은 상태로 유지되도록 할 수 있습니다.

정적 변수는 스칼라 또는 스칼라 표현식으로만 정의할 수 있습니다(PHP 5.6부터). 여기에 다른 값을 할당하면 적어도 이 글을 쓰는 시점에는 오류가 발생할 수밖에 없습니다. 하지만 다음 코드 줄에서 이 작업을 수행할 수 있습니다.

으아아아

결과:

으아아아

정적 함수는 동일한 클래스의 객체 메서드 간 "공유" 메커니즘입니다. 다음 예를 보면 쉽게 이해할 수 있습니다.

으아아아

이 기능은 동일한 클래스의 개체에만 적용됩니다. 객체가 서로 다른 클래스에 속해 있는 경우(서로 확장하더라도) 정적 변수는 예상대로 작동합니다.

정적 변수가 함수 호출 간의 값을 유지하는 유일한 방법인가요?

함수 호출 간의 값을 유지하는 또 다른 방법은 클로저를 사용하는 것입니다. 클로저는 PHP 5.3에서 도입되었습니다. 간단히 말해서, 특정 변수 세트에 대한 액세스를 함수 범위 내의 다른 익명 함수로 제한할 수 있으며, 이는 해당 변수에 액세스할 수 있는 유일한 방법입니다. 클로저 내에서 변수는 객체 지향 프로그래밍의 "클래스 상수"(값으로 클로저에 전달되는 경우) 또는 "개인 속성"(참조로 전달되는 경우)의 개념을 (다소 성공적으로) 에뮬레이트할 수 있습니다.

사실 후자를 사용하면 정적 변수 대신 클로저를 사용할 수 있습니다. 어떤 방법을 사용할지는 전적으로 개발자의 결정에 달려 있지만 정적 변수는 재귀를 처리할 때 매우 유용하며 개발자의 관심을 받을 가치가 있다는 점은 언급할 가치가 있습니다.

P粉574695215

가변 범위란 무엇입니까

변수에는 제한된 "범위" 또는 "액세스할 수 있는 위치"가 있습니다. $foo = 'bar'; 애플리케이션 어딘가에 한 번 썼다고 해서 애플리케이션의 다른 곳에서 $foo를 참조할 수 있다는 의미는 아닙니다. $foo 변수는 특정 범위 내에서 유효하며 동일한 범위 내의 코드에서만 액세스할 수 있습니다.

PHP에서 범위를 어떻게 정의하나요?

매우 간단합니다. PHP에는 함수 범위가 있습니다. 이는 PHP에 존재하는 유일한 범위 구분 기호입니다. 함수 내의 변수는 해당 함수 내에서만 사용할 수 있습니다. 함수 외부의 변수는 함수 외부 어디에서나 사용할 수 있지만 함수 내부에서는 사용할 수 없습니다. 이는 PHP에 전역 범위라는 특별한 범위가 있음을 의미합니다. 함수 외부에서 선언된 변수는 전역 범위에 있습니다.

예:

으아아아

$foo is in the global scope, $baz is in a local scope inside myFunc. Only code inside myFunc has access to $baz. Only code outside myFunc has access to $foo 어느 쪽도 다른 쪽에는 액세스할 수 없습니다.

으아아아

범위 및 포함된 파일

파일 경계는 범위를 분리하지 않습니다.

a.php

으아아아

b.php

으아아아

포함된 코드에 적용되는 규칙은 다른 코드에 적용되는 규칙과 동일합니다. 즉, 함수만 범위를 구분할 수 있습니다. 범위 측면에서 포함 파일을 복사하여 붙여넣는 코드로 생각할 수 있습니다.

c.php

으아아아

위의 예에서 a.php는 myFunc 내에 포함되어 있으며 a.php의 모든 변수에는 로컬 함수 범위만 있습니다. a.php에서 전역적으로 범위가 지정된 것처럼 보인다고 해서 실제로 그런 것은 아니며 해당 코드가 포함/실행되는 컨텍스트에 따라 달라집니다.

함수 및 함수 내부의 클래스와 관련하여 다른 상황은 어떻게 처리되나요?

각각의 새로운 함수 선언은 새로운 범위를 도입합니다. 그렇게 간단합니다.

(익명) 함수 내부의 함수입니다.

으아아아

카테고리

으아아아

스코프의 용도는 무엇인가요?

범위 지정 문제를 처리하는 것은 짜증나는 것처럼 보일 수 있지만 제한된 변수 범위는 복잡한 애플리케이션을 작성하는 데 매우 중요합니다! 애플리케이션에서 선언한 모든 변수를 어디에서나 액세스할 수 있는 경우 변수 변경 사항을 추적할 수 없습니다. 변수에 제한된 수의 합리적인 이름만 지정할 수 있으며 "$name" 변수를 여러 곳에서 사용할 수 있습니다. 애플리케이션에 고유한 변수 이름이 하나만 있을 수 있는 경우 변수의 고유성을 보장하고 잘못된 코드 조각에서 잘못된 변수를 변경하지 않도록 하기 위해 매우 복잡한 명명 체계를 사용해야 합니다.

다음과 같습니다:

으아아아

스코프가 없다면 위 함수는 무엇을 하게 될까요? $bar는 어디에서 왔나요? 어떤 상태인가요? 초기화됐나요? 매번 확인해야 하나요? 이는 유지 관리가 불가능합니다. 그 결과...

범위 경계를 넘어

올바른 방법: 변수 전달 및 전달

으아아아

$bar 변수는 함수 매개변수로 범위에 명시적으로 전달됩니다. 이 함수만 봐도 그것이 사용하는 값이 어디서 왔는지 명확해진다. 그런 다음 명시적으로 값을 반환합니다. 호출자는 함수가 사용할 변수와 반환 값의 출처를 확인할 수 있습니다.

으아아아

변수의 범위를 익명 함수로 확장

으아아아

익명 함수는 주변 범위의 $foo 변수를 명시적으로 포함합니다. 이는 전역 범위와 동일하지 않습니다.

잘못된 방법: global

앞서 언급했듯이 전역 범위는 특별하며 함수는 전역 범위에서 변수를 명시적으로 가져올 수 있습니다.

으아아아

이 함수는 전역 변수 $foo를 사용하고 수정합니다. 이러지 마세요! (당신이 하고 있는 일을 정말로 정말로 정말로 알지 않는 한, 심지어 그때라도: 하지 마세요!)

이 함수의 호출자는 다음 내용만 볼 수 있습니다:

으아아아

이 기능에 부작용이 있다는 징후는 없지만 실제로는 있습니다. 일부 기능이 지속적으로 수정되고 일부 전역 상태에 따라 달라지면 이는 쉽게 지저분한 상황으로 바뀔 수 있습니다. 함수가 호출 횟수에 관계없이 입력에 대해서만 작동하고 정의된 출력을 반환하는 상태 비저장 함수를 원합니다.

가능하다면 어떤 상황에서도 전역 범위를 사용하지 마세요. 특히 변수는 전역 범위에서 로컬 범위로 "추출"되어서는 안 됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿