반응형
함수 내부의 전역 변수에 액세스 할 수 없습니다.
이것은 (내 코드의 단순화 된 버전) 작동하지 않습니다.
<?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을 선언합니다.
<?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
접근 방식에 비해 몇 가지 장점이 있습니다.
- With this strategy, you will always be able to put a breakpoint inside
setXML()
to find out what part of your application has manipulated this value, which you cannot do when manipulating globals. - You avoid polluting the global namespace with a generic variable name
sxml
.
ReferenceURL : https://stackoverflow.com/questions/5449526/cant-access-global-variable-inside-function
반응형
'development' 카테고리의 다른 글
사용하다 (0) | 2020.12.28 |
---|---|
NSString이 특정 문자 (.jpg)로 끝나는 지 어떻게 확인할 수 있습니까? (0) | 2020.12.28 |
레이크 인 유닛 및 기능 테스트의 시드 값 사용 (0) | 2020.12.28 |
C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기 (0) | 2020.12.27 |
Android에서 EditText 서식을 지정하는 전화 번호 (0) | 2020.12.27 |