Cam*_*tin 56 php variables scope global-variables
这(我的代码的简化版)不起作用:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
$child = $sxml->addChild('child');
}
foo();
?>
Run Code Online (Sandbox Code Playgroud)
为什么?我想访问,$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();
?>
Run Code Online (Sandbox Code Playgroud)
Jav*_*i R 111
你必须将它传递给函数:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml){
$child = $sxml->addChild('child');
}
foo($sxml);
?>
Run Code Online (Sandbox Code Playgroud)
或宣布全球:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
Run Code Online (Sandbox Code Playgroud)
如果变量不是全局变量而是在外部函数中定义,则第一个选项(作为参数传递)的工作方式相同:
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml) {
$child = $sxml->addChild('child');
}
foo($sxml);
}
bar();
?>
Run Code Online (Sandbox Code Playgroud)
或者,通过在子句中声明变量来创建闭包use.
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo() use(&$xml) {
$child = $sxml->addChild('child');
}
foo();
}
bar();
?>
Run Code Online (Sandbox Code Playgroud)
mar*_*rio 20
您需要将全局变量显式地邀请到函数范围中:
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
Run Code Online (Sandbox Code Playgroud)
使用 global 关键字在函数内声明 $sxml。
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
Run Code Online (Sandbox Code Playgroud)