loserwn同学最近在测试一个新的东东,发现在一个文件里调用的global变量不起作用:
a.php:
$g_v = 'aa';
function g_test(){
var_dump($g_v);
}
b.php:
include('a.php');
class xxx{
public function run(){
g_test();
//结果是NULL
}
}
从理论上来讲,a.php中的代码没有任何问题,b.php直接调用的是全局函数,应该也没有问题啊,可是死活就是获取不到全局变量的值,然后在a中调用g_test(),单独运行a.php,没有问题;单独写一个文件include,然后调用g_test(),也没有问题,直接google ”php global“也没有找到有用的信息,后来仔细一想,有可能跟类的autoload有关,又仔细阅读了php关于autoload的手册,在”EXAMPLE“部分看到有人提到这个问题:
”While using an "autoloading" method you should
pay attention to variables scope. Because of new file will be included
INSIDE of magic function __autoload - all of declared in such file
global scope variables will be only available within this function and
nowhere else. This will cause strange behaviour in some cases.
“
大意是:当使用autoload方法时,要格外注意变量的作用域。由于新文件是在_autoload函数里进行include,所以include的“新文件”中的“全局变量”就成了__autoload函数的局部变量,只能在__autoload函数作用域内引用。在某种情况下可能会导致一些奇怪的现象。
我们的项目使用了框架,自然会用到autoload,所以也就导致了无法获取global变量的情况,也就是说,实际的代码是:
__autoload(){
inlucde(b.php);
--include(a.php);
//已经是局部变量
--$g_v = 'aa';
--function g_test(){
-- //全局变量没有$g_v
-- global $g_v;
-- var_dump($g_v);
--}
g_test();
}
这是一个很麻烦的问题,php官网应该将这个内容加到__autoload或者global的说明文档中,而不是以example的方式。
分享到:
相关推荐
AtPhpSettings 用于配置php设置的ZF2模块。 要求 ...要根据需要配置php设置,请将以下内容添加到config / autoload / global.php文件中: 'php_settings' => [ 'display_startup_errors' => false ,
// Installed via `composer [global] require`. $autoloader = realpath($rootDir . '/../../autoload.php'); } if (! $autoloader) { throw new RuntimeException( 'ApiGen was ...
本篇文章将详细讲解如何利用PHP的mysqli类实现数据的缓存功能,以及如何在框架中结合`__autoload()`函数进行优化。 首先,MySQLi类相较于旧版的MySQL扩展,提供了更多面向对象的接口,同时也支持新的MySQL特性,如...
### 关于PHP常见面试题详解 #### 1. PHP是什么类型的编程语言? PHP是一种服务器端的...以上为部分常见PHP面试题及其详细解答,后续问题如函数与方法的区别、文件操作、命名空间定义及使用方法等将在下篇继续解析。
若想在函数内部访问全局变量,需要使用`global`关键字。 - **局部作用域**:变量在函数内部声明,只能在函数内部访问。当函数执行结束时,这些变量会被销毁。 - **静态作用域**:使用`static`关键字在函数内部声明...
Zend Framework 2 的 Smarty 模块安装将config/smarty.global.php复制到您的config/autoload/目录。 $ cp vendor/ngyuki/zf2-smarty/config/smarty.global.php config/autoload/ 修复config/autoload/smarty.global....
在PHP开发过程中,提高编程效率不仅可以帮助开发者更快地完成项目,还能在一定程度上提升代码质量与可维护性。以下将详细阐述这53个要点,并针对每个要点提供实用建议。 #### 1. 使用`static`关键字 在循环内部使用...
Smarty是一个流行的PHP模板引擎,它将业务逻辑与呈现逻辑分离,使得开发者可以更专注于网站的结构和设计。本文将详细讲解Smarty中37个重要的变量,这些变量在编写Smarty程序时起到关键作用。 1. SMARTY_DIR:这个...
你需要在`config/autoload/global.php`或`local.php`中配置视图助手路径和模板目录。 ```php return array( 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, '...
在 `config/autoload/global.php` 中配置数据库连接参数,如 DSN、用户名和密码。 ### 五、创建数据访问对象(DAO) 在 `module/Application/src/Model` 下创建 `MessageDao.php`,实现对留言表的CRUD操作,包括...
require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; $apiKey = '你的TinyPNG API密钥'; $client = new Client(); function compressImage($filePath) ...
- **自动加载**:正确配置自动加载机制(如 `__autoload`),可以减少代码中的显式包含语句,提高代码组织性和可维护性。 #### 5. 文件包含优化 - **`require_once()`**:优于 `include`,它确保文件只被包含一次...
EventDispatcher 这个模块是旧的,笨拙的,没有维护,所以请不要使用它:) ...到config/autoload/event_dispatcher.global.php 恭喜你您已完成,并且库已成功安装(希望如此)。 要订阅mvc事件,这就像将您的侦
在使用命名空间时,还应注意“超空间(The Global Namespace)”的概念。超空间是指那些未被指定到任何命名空间的变量、类和函数。在超空间中的函数,既可以通过标准的函数调用方式使用,也可以通过全局命名空间的...
#Zend Framework 2 管理后台 Zend Framework 2 开发管理后台, 开源项目 ...也可使用其它库名, config/autoload/global.php 修改配置 (可忽略此步骤) 按照ZF2 官方文档配置虚拟主机 ServerName zf
将zf2-analytics.global.php.dist文件复制粘贴到您的autoload文件夹,然后通过将Zf2Analytics添加到您的application.config.php文件来启用该模块。 用法 use Racecore \ GATracking \ GATracking ; $ analytics = ...