PHP函数外定义数组未在作用域声明时无法在函数内取值的问题
问题现象
读取自定义数组值时程序抛出如下错误:
Undefined variable: titulo_por_permissao in /home/user/scripts/code.php on line 10
触发报错的代码如下:
<?php $titulo_por_permissao = [ 0 => 'Membro', 1 => 'Ponto de venda', 2 => 'Representante', 5 => 'Administrador' ]; function pegaTitulo($permissao){ $result = $titulo_por_permissao[$permissao] ? $titulo_por_permissao[$permissao] : 'Nenhum'; return $result; } echo pegaTitulo(1);
将数组作为参数传入函数时代码可正常运行,示例如下:
<?php $titulo_por_permissao = [ 0 => 'Membro', 1 => 'Ponto de venda', 2 => 'Representante', 5 => 'Administrador' ]; function pegaTitulo($permissao,$titulo_por_permissao){ $result = $titulo_por_permissao[$permissao] ? $titulo_por_permissao[$permissao] : 'Nenhum'; return $result; } echo pegaTitulo(1,$titulo_por_permissao);
需求为:变量声明在函数外部时,无需作为参数传入,即可在函数内部直接调用。
错误原因
PHP 函数默认拥有独立的局部作用域,函数内部无法直接读取全局作用域声明的变量。传参能正常运行的本质,是把全局变量的值传入了函数的局部作用域,因此可以被读取。
实现方案
有两种常用方式可以实现无需传参直接读取外部变量:
- 方法1:函数内用
global关键字引入全局变量
在函数内部开头声明要引入的全局变量,即可直接调用,代码示例:
<?php $titulo_por_permissao = [ 0 => 'Membro', 1 => 'Ponto de venda', 2 => 'Representante', 5 => 'Administrador' ]; function pegaTitulo($permissao){ // 引入全局作用域下的对应变量 global $titulo_por_permissao; // 增加isset判断避免传入不存在的权限键时抛出notice级错误 $result = isset($titulo_por_permissao[$permissao]) ? $titulo_por_permissao[$permissao] : 'Nenhum'; return $result; } echo pegaTitulo(1);
- 方法2:通过
$GLOBALS超全局数组读取
PHP 内置的$GLOBALS是超全局变量,全局作用域下声明的所有变量都会以变量名为键存入该数组,无需额外声明即可在任意作用域读取,代码示例:
<?php $titulo_por_permissao = [ 0 => 'Membro', 1 => 'Ponto de venda', 2 => 'Representante', 5 => 'Administrador' ]; function pegaTitulo($permissao){ // 直接通过超全局数组读取外部变量 $result = isset($GLOBALS['titulo_por_permissao'][$permissao]) ? $GLOBALS['titulo_por_permissao'][$permissao] : 'Nenhum'; return $result; } echo pegaTitulo(1);
补充说明:虽然上述两种方式可以实现免传参读取外部变量,但实际开发中更推荐传参的写法,代码耦合度更低、可维护性更强,不会因为外部变量的修改意外导致函数逻辑异常。
内容的提问来源于stack exchange,提问作者Antharaz
相关产品推荐
相关产品推荐

