4

我正在使用一个两次调用同一类并引发错误的脚本:

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,因此该类位于代码段中,而不是实际文件中。这就是他们如何称呼他们的片段:

$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 函数,我应该收到两个不同的结果。

4

4 回答 4

9

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

<?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 );
于 2012-06-12T00:04:33.023 回答
5

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

于 2012-06-11T23:48:17.083 回答
3

如果您无法修改将类文件带入 CMS 的方式(使用require_onceor include_once),请修改您的代码段:

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

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

于 2012-06-11T23:51:22.490 回答
2

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

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

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

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

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

于 2012-06-11T23:48:02.523 回答