首页 > 解决方案 > 什么时候全局函数不是可调用的?

问题描述

我有一个特殊的情况,我需要允许函数的外部定义,并在测试套件中使用它们。PHP 允许您在任何地方定义全局函数很奇怪,但它的行为似乎不一致。

如果我将其作为独立脚本运行,$a则为true

function php()
{
    return false;
}

$a = is_callable('php');

但是,如果我在 PHPUnit 测试(测试外部定义函数的注入)中运行相同的代码,则同一事物的断言将失败,如下所示:

class MyTest extends TestCase
{
    public function testThis()
    {
        function php()
        {
            return false;
        }

        self::assertTrue(is_callable('php'));
    }
}

如果它显式地在全局范围内,它仍然会以同样的方式失败:

class MyTest extends TestCase
{
    public function testThis()
    {
        self::assertTrue(is_callable('php'));
    }
}

function php()
{
    return false;
}

根据文档

PHP 中的所有函数和类都具有全局作用域——即使它们是在函数内部定义的,它们也可以在函数外部调用,反之亦然。

我知道嵌套函数定义必须在此之前运行才能使其可访问,但是这两个示例都是这样做的。

PHPUnit 是否会阻止全局函数的定义?

标签: phpfunctionscopephpunit

解决方案


最合理的解释是你的代码不在全局命名空间中。如下所示

<?php
namespace App;

function php() {
}

var_dump(is_callable('App\\php'));

推荐阅读