`

php的autoload与global

阅读更多

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的方式。

1
5
分享到:
评论
3 楼 silentime 2011-03-30  
bardo 写道
好的程序是没有全局变量的。
因为函数,或对象的方法,就是一个语义,用全局变量,变会使得语义不全。
使用全局变量的原因不外乎:
1、未使用单件模式共享类,或共享函数。
2、缺少中间人,当然,这样的“中间人”角色在设计模式中有很多种。
供参考!


你是从纯面向对象的角度考虑,当然不需要全局变量了,但是对PHP来说,还是需要用全局变量,比如“共享”变量,但是问题也很多,如果只是为了共享一个全局的“只读”变量,还是建议用定义常量的方式。
2 楼 bardo 2011-03-20  
好的程序是没有全局变量的。
因为函数,或对象的方法,就是一个语义,用全局变量,变会使得语义不全。
使用全局变量的原因不外乎:
1、未使用单件模式共享类,或共享函数。
2、缺少中间人,当然,这样的“中间人”角色在设计模式中有很多种。
供参考!
1 楼 loserwn 2011-03-17  
global这个问题困扰了我很久。
看来,还是对autoload理解的不彻底啊。
补充一下:
Yii中的autoload实现是在:
Yii->framework->YiiBase.php中

核心代码是:
public static function autoload($className){} ;
.....
spl_autoload_register(array('YiiBase','autoload'));

相关推荐

    AtPhpSettings:ZF2模块,用于管理php设置

    AtPhpSettings 用于配置php设置的ZF2模块。 要求 ...要根据需要配置php设置,请将以下内容添加到config / autoload / global.php文件中: 'php_settings' => [ 'display_startup_errors' => false ,

    ApiGen-masterAPI文档PHP库.zip

     // Installed via `composer [global] require`.  $autoloader = realpath($rootDir . '/../../autoload.php'); } if (! $autoloader) {  throw new RuntimeException(  'ApiGen was ...

    php缓存数据功能的mysqli类

    本篇文章将详细讲解如何利用PHP的mysqli类实现数据的缓存功能,以及如何在框架中结合`__autoload()`函数进行优化。 首先,MySQLi类相较于旧版的MySQL扩展,提供了更多面向对象的接口,同时也支持新的MySQL特性,如...

    关于PHP常见面试题.pdf

    ### 关于PHP常见面试题详解 #### 1. PHP是什么类型的编程语言? PHP是一种服务器端的...以上为部分常见PHP面试题及其详细解答,后续问题如函数与方法的区别、文件操作、命名空间定义及使用方法等将在下篇继续解析。

    php常见面试问题及答案

    若想在函数内部访问全局变量,需要使用`global`关键字。 - **局部作用域**:变量在函数内部声明,只能在函数内部访问。当函数执行结束时,这些变量会被销毁。 - **静态作用域**:使用`static`关键字在函数内部声明...

    zf2-smarty:Zend Framework 2 的 Smarty 模块

    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个要点

    在PHP开发过程中,提高编程效率不仅可以帮助开发者更快地完成项目,还能在一定程度上提升代码质量与可维护性。以下将详细阐述这53个要点,并针对每个要点提供实用建议。 #### 1. 使用`static`关键字 在循环内部使用...

    smarty程序员应该知道37个变量.pdf

    Smarty是一个流行的PHP模板引擎,它将业务逻辑与呈现逻辑分离,使得开发者可以更专注于网站的结构和设计。本文将详细讲解Smarty中37个重要的变量,这些变量在编写Smarty程序时起到关键作用。 1. SMARTY_DIR:这个...

    zf2 框架的模版一个模版实例

    你需要在`config/autoload/global.php`或`local.php`中配置视图助手路径和模板目录。 ```php return array( 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, '...

    超简单zendframework留言板

    在 `config/autoload/global.php` 中配置数据库连接参数,如 DSN、用户名和密码。 ### 五、创建数据访问对象(DAO) 在 `module/Application/src/Model` 下创建 `MessageDao.php`,实现对留言表的CRUD操作,包括...

    TinyPNG:PHP脚本使用TinyPNG.com API压缩png图像

    require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; $apiKey = '你的TinyPNG API密钥'; $client = new Client(); function compressImage($filePath) ...

    经典总结php效率高写法!

    - **自动加载**:正确配置自动加载机制(如 `__autoload`),可以减少代码中的显式包含语句,提高代码组织性和可维护性。 #### 5. 文件包含优化 - **`require_once()`**:优于 `include`,它确保文件只被包含一次...

    eventdispatcher:轻松将侦听器附加到ZF2的MVC事件

    EventDispatcher 这个模块是旧的,笨拙的,没有维护,所以请不要使用它:) ...到config/autoload/event_dispatcher.global.php 恭喜你您已完成,并且库已成功安装(希望如此)。 要订阅mvc事件,这就像将您的侦

    PHP命名空间(Namespace)简明教程

    在使用命名空间时,还应注意“超空间(The Global Namespace)”的概念。超空间是指那些未被指定到任何命名空间的变量、类和函数。在超空间中的函数,既可以通过标准的函数调用方式使用,也可以通过全局命名空间的...

    platform-admin:[DEPRECATED][READ-ONLY]此项目设计失败,新项目结构设计中,具体关注 zfeggzfegg-admin-skeleton

    #Zend Framework 2 管理后台 Zend Framework 2 开发管理后台, 开源项目 ...也可使用其它库名, config/autoload/global.php 修改配置 (可忽略此步骤) 按照ZF2 官方文档配置虚拟主机 ServerName zf

    zf2-analytics:google-measurement-php-client 的 zf2 模块包装器

    将zf2-analytics.global.php.dist文件复制粘贴到您的autoload文件夹,然后通过将Zf2Analytics添加到您的application.config.php文件来启用该模块。 用法 use Racecore \ GATracking \ GATracking ; $ analytics = ...

Global site tag (gtag.js) - Google Analytics