【问题标题】:Cannot redeclare class - Check if class already exists无法重新声明类 - 检查类是否已存在
【发布时间】:2012-06-11 23:44:44
【问题描述】:

我正在使用一个脚本,它两次调用同一个类并抛出错误:

Fatal: Cannot redeclare class urlConverter (/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php:14)

我已尝试将以下代码放入:

if( !class_exists( 'urlConverter', false ) )
{
    $urlConverter = new urlConverter( $modx );
}

但是,我正在使用的 CMS 报告了错误 500,并且无法在日志中看到它抛出该错误的原因。

有谁知道如何检查该类是否已正确声明?

编辑:

我使用的是 CMS,因此该类位于代码段中,而不是实际文件中。他们是这样称呼他们的 sn-ps 的:

$data['viewonlinelink'] = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $string ) ) );

我需要再次调用它以获得不同的结果。

编辑2:

这里是 urlConverter:

<?php
class urlConverter {

public $modx;

public function __construct( modX &$modx )
{
    $this->modx =& $modx;
}


public function action( $scriptProperties )
{
    return $this->$scriptProperties['action']( $scriptProperties['string'] );
}

private function encrypt( $str )
{
    return $str;
}


private function decrypt( $str )
{
      return $str;
}


}
}
 $urlConverter = new urlConverter( $modx );
 return $urlConverter->action( $scriptProperties );

现在我从另一个脚本中调用以下内容:

    $data['viewonlinelink'] = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $string ) ) );
    $data['confirmonline']  = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $reversed ) ) );

在我的 urlConverter 类中运行 encrypt 函数,我应该会收到两个不同的结果。

【问题讨论】:

  • 您是否包含/需要类文件?如果是这样,请改用include_oncerequire_once
  • 它可能是你在某处复制的要求/包含。
  • 我有点包括在内。我正在使用一个名为 MODx 的 CMS。我将使用他们 CMS 中的 require 语句修改我的问题。
  • 在查看在线文档时,您可能需要修改sn-p代码:rtfm.modx.com/display/revolution20/Snippets尝试将include更改为include_once
  • @TimWithers 我假设您指的是 if (file_exists($file)) { $o = include $file; } else { $o = '文件未找到:'.$file; } 返回 $o;我想我可以尝试一下。我没有那样引用他们的 sn-ps,但这不会造成伤害。

标签: php oop class


【解决方案1】:

在使用更新后的代码时,将类文件更改为:

<?php
if(!class_exists('urlConverter')){
    class urlConverter {

        public $modx;

        public function __construct( modX &$modx ){
            $this->modx =& $modx;
        }
        public function action( $scriptProperties ){
            return $this->$scriptProperties['action']( $scriptProperties['string'] );
        }

        private function encrypt( $str ){
            return $str;
        }


        private function decrypt( $str ){
          return $str;
        }

    }
 }
$urlConverter = new urlConverter( $modx );
return $urlConverter->action( $scriptProperties );

【讨论】:

  • 哦,我现在明白了! MODx 使用 PDO 将类缓存到它们的注册表中。这很好用。
【解决方案2】:

redeclare class 错误不是由创建类的新实例引起的,它是通过在同一符号上调用 class 运算符来调用的。您可能多次包含urlConverter 类定义文件。

【讨论】:

  • 是的,这似乎是正确的。我不知道该怎么做。我正在使用的 CMS 会自动执行此操作,我没有太多选择。
  • @Peter 如果您无法修改 CMS,请将您的代码修改为创建之前尚未创建的类(而不是实例)。
  • @JonathanSampson 你是什么意思?
【解决方案3】:

如果您无法修改将类文件引入 CMS 的方式(使用 require_onceinclude_once),请修改您的 sn-p:

if( !class_exists( 'urlConverter' ) ) {
    class urlConverter {
        /* Build class */
    }
}

当然,如果您在同一个文件中还有其他内容,您需要确保它不会尝试运行两次。

【讨论】:

  • Hmm.. 这抑制了错误,但我第二次尝试从类中获取输出时它没有返回任何内容。
  • @Peter 您能否用您目前尝试的内容更新您的问题?这应该是您唯一拨打class_exists的地方。
【解决方案4】:

看起来定义类的文件被多次包含,这就是您收到第一个错误的原因(无法重新声明类)。

/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php line 14 似乎是多次包含该类的内容。如果可能,将include 更改为include_once,这样您就不会多次定义该类。

要进一步调试(而不是看到 500 内部服务器错误),请尝试尽早将以下内容添加到您的代码中:

error_reporting(E_ALL);
ini_set('display_errors', 1);

否则,请检查服务器 error_log (Apache),看看那里是否有任何关于 500 错误的有用信息。

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2011-03-22
    • 2023-03-29
    • 2016-02-24
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多