함수 내부의 전역 변수에 액세스할 수 없습니다.
이(내 코드의 단순화된 버전)는 작동하지 않습니다.
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
$child = $sxml->addChild('child');
}
foo();
?>
왜요? 액세스하고 싶습니다.$sxml
왜냐하면 나는 그것에 오류를 기록하고 싶기 때문입니다.foo()
실패합니다.foo()
디렉터리 목록을 만들기 위해 스스로를 재귀적으로 호출하기 때문에 전체를 전달하는 것이 두렵습니다.$sxml
(에 있는 것처럼) 저절로)foo($sxml)
)는 성능을 저하시킬 수 있습니다.
액세스할 수 있는 방법이 있습니까?$sxml
안에서.$foo
인수로 전달하지 않고? (PHP 5.2.x+)
편집: 만약 코드가 이렇게 보인다면요?
<?php
bar(){
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
$child = $sxml->addChild('child');
}
foo();
}
bar();
?>
이 정보를 함수에 전달해야 합니다.
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml){
$child = $sxml->addChild('child');
}
foo($sxml);
?>
또는 글로벌로 선언:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
변수가 전역이 아닌 외부 함수에 정의된 경우 첫 번째 옵션(인수로 전달)은 동일하게 작동합니다.
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml) {
$child = $sxml->addChild('child');
}
foo($sxml);
}
bar();
?>
또는 변수를 다음으로 선언하여 폐쇄를 만듭니다.use
절
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo() use(&$xml) {
$child = $sxml->addChild('child');
}
foo();
}
bar();
?>
글로벌 변수를 함수 범위로 명시적으로 초대해야 합니다.
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
함수 내부에 $sxml을 선언하려면 global 키워드를 사용합니다.
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
다른 솔루션은 $GLOBALS를 사용하여 변수를 선언하는 것입니다.
$my_var = 'blabla'; // not global
$GLOBALS['my_var'] = 'blabla'; // global (correct)
최상의 답변은 좋은 해결책을 제공하지만, 대부분의 현대 PHP 응용 프로그램에서 적절한 해결책은 다음과 같은 정적 변수를 가진 클래스를 만드는 것이라고 주장하고 싶습니다.
<?php
class xmlHelper {
private static $sxml;
public function getXML() {
return self::$sxml;
}
public function setXML($xml) {
self::$sxml = $xml;
}
}
xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));
function foo(){
$child = xmlHelper::getXML()->addChild('child');
}
foo();
이 접근 방식을 사용하면 액세스할 수 있습니다.$sxml
내부에서foo()
당신이 원했던 것처럼, 하지만 그것은 그것보다 몇 가지 이점이 있습니다.global
접근.
- 이 전략을 사용하면 언제든지 내부에 중단점을 둘 수 있습니다.
setXML()
글로벌을 조작할 때 수행할 수 없는 이 값을 조작한 응용 프로그램의 부분을 확인합니다. - 일반 변수 이름으로 글로벌 네임스페이스를 오염시키지 않도록 합니다.
sxml
.
언급URL : https://stackoverflow.com/questions/5449526/cant-access-global-variable-inside-function
'source' 카테고리의 다른 글
CSS 선택기("A 또는 B) 및 C")? (0) | 2023.09.02 |
---|---|
수식이 아닌 텍스트/데이터가 있는 필드만 카운트 (0) | 2023.09.02 |
NestedScrollView 내에서 RecyclerView를 사용하는 방법은 무엇입니까? (0) | 2023.09.02 |
MariaDB REGEXP_REPLACE 백레퍼런스가 FUNCTION에서 작동하지 않음 (0) | 2023.09.02 |
C의 구조 배열에서 'size of'의 결과는? (0) | 2023.09.02 |