【问题标题】:function_exists returns false but declaration throws errorfunction_exists 返回 false 但声明抛出错误
【发布时间】:2012-03-08 03:22:11
【问题描述】:

在 PHP 5.3.6 中,我有一个类,其方法如下:

public function chunkText()
{
  if(!function_exists('unloadChunkText')) {
     function unloadChunkText() {
        . . .
     }
  }
  . . .
}

其中 unloadChunkText 是 chunkText 的辅助方法。问题是,每当我调用 $obj->chunkText() 时,都会出现此错误:

无法重新声明诊断\问题\unloadChunkText()(以前 宣布于 文件.php:34) 在文件.php 上线34

为什么 function_exists 没有告诉我这个函数已经存在?

【问题讨论】:

  • 你确定它也不是变量吗?
  • 如果你使用function_exists('diagnostic\question\unloadChunkText')会发生什么?
  • @idiqual 是的,肯定不是。
  • @Mike B,修复了它。谢谢!

标签: php oop function fatal-error


【解决方案1】:

您正在检查全局函数 unloadChunkText,而不是特定于命名空间的函数 diagnostic\question\unloadChunkText。但我怀疑你的方法有缺陷。

如果您的方法 chunkText() 有一个辅助函数,请使用以下两种方式之一定义它:

作为闭包:

public function chunkText()
{
  $unloadChunkText = function () {
    // . . .
  };
  // . . .
  // Call it like $unloadChunkText()
}

作为对象的私有方法:

private function unloadChunkText ()
{
  // . . .
}

public function chunkText()
{
  // . . .
  // Call it like $this->unloadChunkText()
}

将其定义为私有方法可能更有意义,因此您不必在每次调用chunkText() 时都浪费时间重新定义它。

【讨论】:

    【解决方案2】:

    提供function_exists()内的范围:

    function_exists('diagnostic\question\unloadChunkText')
    

    【讨论】:

    • 您是否可以通过这种方式向我指出文档以提供function_exists 的范围?我不知道这是可能的!
    • @kavisiegel 我也是!根据错误消息,这是在黑暗中拍摄的。我在 function_exists 的手册中找不到任何有关范围的信息。
    • 这回答了我的问题,谢谢。不过,为了简洁起见,最终还是使用 DaveRandom 的答案修改了我的代码。
    • @beanland 没有难过的感觉。戴夫的回应绝对是要走的路。祝你好运!
    【解决方案3】:

    function_exists 的问题是您无法为它提供范围。尝试改用is_callable,回调将是array($this, 'unloadChunkText')

    或者,method_exists 是另一种可能性。 method_exists($this, 'unloadChunkText')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多