2015-11-04 95 views
1

我正在帮助客户排查一些问题,据我所知,在PHP 5.5(Joomla目前为2.5.20)更新后出现。这些错误是从一些归因于Joomla CMS的行中抛出的(尽管我不认为这是原因)。无论哪种方式,这里有一些代码段和我需要帮助各自的错误:PHP严重错误&Joomla

$app =& JFactory::getApplication(); 

PHP严格的标准:只有变量应参考分配...


public function getModel($name = 'Submission', $prefix = 'AwardAdminModel') 
     { 
      $model = parent::getModel($name, $prefix, array('ignore_request' => true)); 
      return $model; 
     } 

getModel ()应该与JController :: getModel兼容($ name ='',$ prefix ='',$ config = Array)


function display($cachable = false) 
    { 
     JRequest::setVar('view', JRequest::getCmd('view', 'Submissions')); 
     parent::display($cachable); 
    } 

显示()应该与JController ::显示器($可缓存=假,$ urlparams = FALSE)


现在,我从来没有与我的PHP之前,但礼貌PHP手册中使用的符号兼容我对它的作用有一些倾向,但我不确定它为什么会投掷 - 我确信我可以将其删除并保持安全。

getModel方法在签名中被标记为代理,果然,它在它自己内部调用了3个参数,因此我不确定这是一个问题。

任何有用的提示或解决方案将不胜感激。

谢谢。

+0

请问你问题了[堆栈的Joomla交易所(http://joomla.stackexchange.com),这是专用的Q&A为Joomla – Lodder

+0

还有网站当你问问时请注明版本。 – Elin

+0

我已经添加了Joomla版本。 – Chase

回答

0

作为一般规则,我总是建议不要更改供应商代码。未来可能会因供应商更新而产生复杂性。考虑一下与供应商预期相匹配的较低版本的PHP是否合适,或者调查供应商的源代码库,以便未来的供应商更新可以合并它。

要回答你的问题: 第一个错误:

PHP Strict Standards: Only variables should be assigned by reference...

在PHP &经常被用于对项目分配别名。这使得可以改变的项目可以被多个名称所知,并且有时可能是有用的。它也曾用于PHP中,当为同一个项目使用不同的名称时更高效,因为PHP在每次给某个东西分配一个新名称时都会进行复制。

由于v5和PHP强烈鼓励使用&仅对变量进行别名,并且只在逻辑上对代码的目的有意义时,后一种情况下PHP的效率已得到显着提高函数的返回值不能成为别名,因为它在逻辑上位于不再存在的函数的局部范围内。

所以是的,它很可能是安全的=&=函数调用。

二错误:

getModel() should be compatible with JController::getModel($name = '', $prefix = '', $config = Array)

这是因为该函数定义不父类相匹配。有一个用3个参数定义getModel的父类。这已经被您发布的代码扩展了,它只用两个参数定义了getModel。

解决方法是更新函数定义以匹配父项。这会使错误消失,但也可能会导致未来的开发人员错误地引导这些未来的开发人员,这些开发人员可能会期望这些额外的参数产生影响,或者以未打算的方式使用该功能;至少尝试通过不祥的参数名称,以减轻这一点:

public function getModel($name = 'Submission', $prefix = 'AwardAdminModel', $unused = array()) 
{ 
    $model = parent::getModel($name, $prefix, array('ignore_request' => true)); 
    return $model; 
} 
+0

对于我给出的最后一个示例,显示的第二个参数通常是$ urlparams,从看起来看,Joomla严重依赖于...每次调用display()时,我都应该传递True作为参数吗?目前,此客户站点中每次对display()的调用都只会调用一个参数。 – Chase

+0

如果您在函数定义中指定了默认参数,那么每次调用函数时都不需要传递它。 –