참고: 이는 PHP의 변수 범위를 다루는 참고 질문입니다. 이 질문과 중복되므로 이 패턴에 맞는 많은 질문 중 하나를 닫으십시오.
PHP에서 "가변 범위"란 무엇입니까? 하나의 .php 파일에 있는 변수를 다른 .php 파일에서 액세스할 수 있습니까? 가끔 "정의되지 않은 변수" 오류가 발생하는 이유는 무엇인가요?
P粉3115638232023-10-20 10:03:09
함수 범위 내에 정의된 변수는 외부에서 접근할 수 없다고 해서 함수가 완료된 후에 해당 값을 사용할 수 없다는 의미는 아닙니다. PHP에는 함수 내에서 정적 변수를 정의하는 데에도 사용할 수 있는 잘 알려진 static
关键字,在面向对象的 PHP 中广泛用于定义静态方法和属性,但应该记住 static
이 있습니다.
정적 변수는 함수 범위에 정의된 일반 변수와 다릅니다. 정적 변수는 프로그램 실행이 범위를 벗어나도 값을 잃지 않습니다. 정적 변수를 사용하는 다음 예를 살펴보겠습니다.
으아악결과:
으아악 $counter
没有 static
那么每次回显的值将与传递给函数的 $num
参数相同。使用 static
을 정의하면 추가 해결 방법 없이 이 간단한 카운터를 구축할 수 있습니다.
정적 변수는 로컬 함수 범위에만 존재합니다. 그럴 리가 없어 정의된 함수 외부에서 액세스됩니다. 그래서 당신은 할 수 있습니다 다음 호출까지 그 값이 유지되는지 확인하세요. 이 기능.
정적 변수는 스칼라 또는 스칼라로만 정의할 수 있습니다. 표현식(PHP 5.6부터). 필연적으로 다른 값을 할당 적어도 이 글을 쓰는 시점에서는 실패로 이어집니다. 하지만 다음 코드 줄에서 이 작업을 수행할 수 있습니다.
으아악결과:
으아악정적 함수는 객체의 메서드 간에 어느 정도 "공유"됩니다. 동급생. 아래 예를 보면 이해하기 쉽습니다.
으아악이 기능은 동일한 클래스의 개체에만 적용됩니다. 정적 변수는 객체가 다른 클래스에 속해 있거나 서로 확장된 경우 예상대로 작동합니다.
함수 호출 사이의 값을 보존하는 또 다른 방법은 클로저를 사용하는 것입니다. 클로저는 PHP 5.3에서 도입되었습니다. 간단히 말해서, 함수 범위 내의 특정 변수 집합에 대한 액세스를 다른 익명 함수로 제한할 수 있으며, 이것이 해당 변수에 액세스할 수 있는 유일한 방법입니다. 클로저 변수 내부에 있으면 구조적 프로그래밍에서 "클래스 상수"(클로저의 값으로 전달되는 경우) 또는 "개인 속성"(참조로 전달되는 경우)과 같은 OOP 개념을 (다소 성공적으로) 에뮬레이션할 수 있습니다.
후자는 실제로 정적 변수 대신 클로저를 사용할 수 있습니다. 무엇을 사용할지 결정하는 것은 항상 개발자의 몫이지만, 정적 변수는 재귀를 사용할 때 확실히 유용하며 개발자의 관심을 받을 가치가 있다는 점을 언급해야 합니다.
P粉8951872662023-10-20 09:03:53
변수는 "범위" 또는 "액세스할 수 있는 위치"로 제한됩니다. 애플리케이션에서 $foo = 'bar';
를 어딘가 에 한 번 썼다고 해서 $foo = 'bar';
一次,并不意味着您可以从引用 $foo
>应用程序内的其他地方。变量 $foo
>다른 곳
$foo
를 참조할 수 있다는 의미는 아닙니다. . $foo
변수에는 유효한 특정 범위가 있으며, 동일한 범위 내의 코드만 변수에 액세스할 수 있습니다. 매우 간단합니다. PHP에는 함수 범위가 있습니다. 이는 PHP에 존재하는 유일한 범위 구분 기호입니다. 함수 내부의 변수는 해당 함수 내에서만 사용할 수 있습니다. 함수 외부의 변수는 함수 외부 어디에서나 사용할 수 있지만 함수 내부에서는 사용할 수 없습니다. 이는 PHP에 특별한 범위, 즉 global
범위가 있음을 의미합니다. 함수 외부에서 선언된 모든 변수는 이 전역 범위에 속합니다.
으아아아
$foo
位于 global 范围内,$baz
位于 内的local 范围内myFunc。只有
myFunc
中的代码才能访问 $baz
。只有myFunc
外部的代码可以访问$foo
$foo
는
$baz
는 에 있는 myFunc의
범위에 있습니다. myFunc
내의 코드만 $baz
에 액세스할 수 있습니다. myFunc
외부의 코드만 $foo
에 액세스할 수 있습니다. 어느 쪽도 상대방에게 접근할 수 없습니다:
범위 및 포함된 파일 파일 경계
분리하지 마세요.범위:
a.phpinclude
代码的规则与适用于任何其他代码的规则相同:仅函数
으아아아
b.php 으아아아
에 대한 별도의 범위에 적용됩니다. 범위 목적을 위해 코드 복사 및 붙여넣기와 같은 파일을 포함하는 것을 고려할 수 있습니다. a.php
包含在 myFunc
中,a.php
中的任何变量仅具有本地函数作用域。仅仅因为它们似乎位于a.php
으아아아
function
위의 예에서 a.php
는 myFunc
에 포함되어 있으며 a.php
의 모든 변수는 로컬 함수 범위만 갖습니다. a.php
내의 전역 범위에 있는 것으로
(익명) 함수 내의 함수
으아아아
$name
강좌< /p>
으아아아
스코프의 용도는 무엇인가요?
🎜범위 지정 문제를 처리하는 것은 짜증나는 것처럼 보일 수 있지만 🎜제한된 변수 범위는 복잡한 애플리케이션을 작성하는 데 매우 중요합니다! 🎜 선언한 모든 변수를 애플리케이션 내의 다른 곳에서 사용할 수 있는 경우 무엇이 변경되었는지 추적할 수 있는 실제 방법 없이 변수에 대한 모든 작업을 단계별로 진행하게 됩니다. 변수에 부여할 수 있는 적절한 이름은 제한되어 있으며 "🎜" 변수를 여러 곳에서 사용하고 싶을 수도 있습니다. 애플리케이션에서 이 고유한 변수 이름을 한 번만 사용할 수 있는 경우 변수가 고유하고 잘못된 코드에서 잘못된 변수를 변경하지 않도록 매우 복잡한 명명 체계를 사용해야 합니다. 🎜 🎜관찰: 🎜으아악범위가 없으면 위 함수는 무엇을 합니까? $bar
어디에서 왔나요? 어떤 상태인가요? 초기화도 됐나요? 매번 확인해야 하나요? 이는 유지 관리가 불가능합니다. 그 결과...
Variables$bar
이 범위를 함수 매개변수로 명시적으로 입력하세요. 이 함수만 봐도 그것이 사용하는 값이 어디서 왔는지 명확해진다. 그런 다음 명시적으로 값을 반환 합니다. 호출자는 함수가 어떤 변수를 사용할지, 반환 값이 어디에서 나올지 확신할 수 있습니다.
익명 함수는 주변 범위에 $foo
를 명시적으로 포함합니다. 이는 global 범위와 동일하지 않습니다.
全局
앞서 언급했듯이 전역 범위는 다소 특별하며 함수는 전역 범위에서 변수를 명시적으로 가져올 수 있습니다.
으아악이 함수는 전역 변수$foo
를 사용하고 수정합니다. 이러지 마세요! (당신이 하고 있는 일을 정말로 정말로 정말로 알지 않는 한, 그리고 그때라도: 하지 마세요!)
이 함수의 호출자가 보는 것은 다음과 같습니다:
으아악이 기능에 부작용이 있다는 징후는 없지만 그렇습니다. 일부 기능은 지속적으로 수정되고 일부 전역 상태가 필요하기 때문에 이는 쉽게 혼란스러울 수 있습니다. 함수를 상태 비저장하여 호출 횟수에 관계없이 입력에 대해서만 작동하고 정의된 출력을 반환하기를 원합니다.
가능하면 어떤 방식으로든 전역 범위를 사용하지 않아야 합니다. 가장 확실하게는 전역 범위에서 로컬 범위로 변수를 "풀"해서는 안 됩니다.