我正在使用一个两次调用同一个类并抛出错误的脚本:
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,因此Class位于Snippet而不是实际文件中。这就是他们称之为片段的方式:
$data['viewonlinelink'] = $this->modx->runSnippet( 'urlConverter', array(
'action' => 'encrypt',
'string' => http_build_query( $string ) ) );
我需要第二次打电话来获得不同的结果。
EDIT2:
这是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类里面的函数加密,我应该收到两个不同的结果。
答案 0 :(得分:5)
redeclare class
错误不是由创建类的新实例引起的,而是通过在同一符号上调用class
运算符来调用它。您可能多次包含urlConverter
类定义文件。
答案 1 :(得分:5)
在使用更新后的代码时,请将类文件更改为:
<?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 );
答案 2 :(得分:2)
看起来定义类的文件被多次包含,这就是为什么你得到第一个错误(不能重新声明类)。
/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php
行14
似乎是多次包含该类的内容。如果可能,请将include
更改为include_once
,这样您就不会多次定义该类。
要进一步调试(而不是看到500内部服务器错误),请尝试尽早将以下内容添加到您的代码中:
error_reporting(E_ALL);
ini_set('display_errors', 1);
否则,请检查服务器error_log
(Apache),看看是否有关于500错误的任何有用信息。
答案 3 :(得分:2)
如果您无法修改类文件进入CMS的方式(使用require_once
或include_once
),请修改您的代码段:
if( !class_exists( 'urlConverter' ) ) {
class urlConverter {
/* Build class */
}
}
当然,如果您在同一个文件中还有其他内容,则需要确保它不会尝试运行两次。