【问题标题】:how are functions made global in php across modules?如何跨模块在 php 中使函数成为全局函数?
【发布时间】:2015-05-04 19:27:35
【问题描述】:

我正在浏览一些遗留的php 代码库。我很难理解函数是如何在 php 中全局化的。这是项目的目录结构。 GlobalUtilities.php 中定义的函数在Profile.php 中可用,而没有任何include_once(../../../GlobalUtilies.php)。怎么会这样?

PHPProject
     com.example.usermanagment
             includes
                    GlobalUtilities.php
             controller
                    Entrycontroller.php
             model
                 classes
                         com
                             example
                                     user
                                         resources
                                                    Profile.php

GlobalUtilies.php中包含这个文件autoloader.php

`autoloader.php`

spl_autoload_register(function($class) {
    $classFile = dirname(__DIR__)
        . DIRECTORY_SEPARATOR . 'model'
        . DIRECTORY_SEPARATOR . 'classes'
        . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';

    if (file_exists($classFile)) {
        include_once($classFile);
    }
});

我查看了spl_autoload_register 的文档,我的理解是它不会在这里使函数成为全局函数

GlobalUtilies.php

require_once('autoloader.php');
......// rest of functions here

编辑: 我刚刚注意到GlobalUtilities.php 中没有关闭 php 标签。 也就是说,我只看到这个<?php 而没有看到?>。 是否会使此文件中定义的函数在全局范围内可用。

【问题讨论】:

  • 自动加载器加载我相信的命名空间类。
  • 好吧,虽然Profile.php 可能不包含GlobalUtilities.php,但Profile.php 可能包含在还包含GlobalUtilies.php 的文件中,可能类似于index.php。在这种情况下,它可以看到功能。
  • @JazzCat 是的,但是 PHP 目前缺少函数自动加载。
  • @Andrea:我看了profile.php。它只有命名空间和其他 use statements 用于导入类。但没有任何形式的includerequire
  • 这是一个框架吗?

标签: php function spl-autoload-register


【解决方案1】:

spl_autoload_register() 使函数成为__autoload()。这意味着如果您尝试使用未定义的函数,它将尝试从您使用的其他包含命名空间中包含它。因此,如果您刚刚在GlobalUtilies.php 中包含了“autoloader.php”,并且您使用了类似com\example\user\resources\Profile 的命名空间,它将自动包含Profile.php 及其所有功能,例如在自动加载功能中配置。

    ...
    include_once($classFile);
    ...

【讨论】:

  • 如果类文件中有函数,是的,这就解释了。
  • @Andrea:类文件中没有函数。我正在从globalUtilities.php 导入函数。这具有所有可用的功能,并且以某种方式“神奇地”在所有模块中可用
  • 我认为如果你显示来自GlobalUtilies.phpProfile.php的一些代码,而不仅仅是autoloader.php,会更好。否则每个人都只能想象它是如何工作的。
猜你喜欢
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多