【问题标题】:Function and class on the same file: undefined function [duplicate]同一文件上的函数和类:未定义的函数[重复]
【发布时间】:2013-02-24 16:26:58
【问题描述】:

根据PSR-0 定义(自动加载),我有一个包含类和函数定义的文件:

namespace Foo;

function b() {};

class Bar {}

我有那个类的测试,放在同一个命名空间中:

namespace Foo;

class BarTest {}

当我尝试访问测试类中的b() 函数时,我收到undefined function 错误:

namespace Foo;

class BarTest extends PHPUnit_Framework_TestCase
{
    public function testSomething()
    {
        b();
        Foo\b();
        \b();
    }
}

似乎没有任何效果。如何调用该函数?

【问题讨论】:

  • 您是否包含了包含bBar 的文件?可能是您有一些自动加载,在您使用该类之前不会包含带有Bar 的文件。
  • testSomething()b(); Foo\b(); \b();你想达到什么目的
  • @FritsvanCampen 我用自动加载信息编辑了问题。
  • 所以?尝试在b 之前调用new Bar(),可以吗?
  • @FritsvanCampen 如果我先实例化对象,它确实有效。

标签: php namespaces psr-0


【解决方案1】:

PHP 自动加载不支持函数。但是它确实适用于 static 类方法:

namespace Foo;

abstract class Util
{
    static function doSomething() {

    }
}

然后你可以use该类在一些其他文件当前命名空间并调用静态方法:

use Foo\Util;

Util::doSomething();

因为这是一个类方法并且自动加载是针对类的,所以这确实有效。

请注意,在命名空间/类中对方法进行分组的更正确方法可能是将其设为 finalDocs,但 PHP 不支持这种做法(请参阅 Cannot create a final abstract class­PHP Sadness #41)。

您可以在网站上的以下问答材料中找到这一点:

【讨论】:

    【解决方案2】:

    你的函数 b();必须有body,改成

    function b(){};

    【讨论】:

    • 其实它确实有一个主体。这是一个错字。
    • 请看这个@drgomesp codepad.viper-7.com/e5Momf
    • 问题是,我想从外部调用b() 函数,并且该类的对象内部没有包装方法。
    • hmm 有趣的问题,我想我已经理解了这个问题......codepad.viper-7.com/3WMaFY
    • 除了我不想在类本身内部使用b() 函数,但总是在外部使用。我只想在该命名空间和该特定文件中声明该类。
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多