【问题标题】:PHP Strict errors with & and Joomla& 和 Joomla 的 PHP Strict 错误
【发布时间】:2015-11-04 21:34:01
【问题描述】:

我正在帮助客户解决一些问题,据我所知,这些问题是在他们更新到 PHP 5.5(Joomla 目前是 2.5.20)之后出现的。这些错误是从归因于 Joomla CMS 的某些行中抛出的(尽管我认为这不是原因)。无论哪种方式,这里有一些我需要帮助的代码 sn-ps 及其各自的错误:

$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);
    }

display() 应该兼容 JController::display($cachable = false, $urlparams = false)


现在我以前从未在我的 PHP 中使用过 & 符号,但由于 PHP 手册的礼貌,我对它的作用有一些倾向,但我不确定它为什么会出现问题 - 我确定我可以删除它并保持安全。

getModel 方法在签名中被标记为代理,果然,它通过自身内部的 3 个参数正确调用它,所以我不确定为什么会出现问题。

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

谢谢。

【问题讨论】:

  • 请通过Joomla Stack Exchange 向您提问,这是Joomla 的专用问答网站
  • 另外当你问的时候请注明版本。
  • 我已经添加了Joomla版本。

标签: php joomla


【解决方案1】:

作为一般规则,我始终建议不要更改供应商代码。它可能会在未来通过供应商更新造成复杂性。考虑匹配供应商期望的较低版本的 PHP 是否合适,或者研究分叉供应商源存储库,以便将来的供应商更新可以合并它。

回答您的问题: 第一个错误:

PHP 严格标准:只能通过引用分配变量...

在 PHP 中,& 通常用于为项目分配别名。这使得可能会更改的项目可以通过多个名称来了解,并且有时会很有用。它也曾经在 PHP 中使用,以便在为同一项目使用不同名称时提高效率,因为 PHP 过去常常在每次为某项分配新名称时进行复制。

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

所以是的,在函数调用中用= 替换=& 很可能是安全的。

第二个错误:

getModel() 应该与 JController::getModel($name = '', $prefix = '', $config = 数组)

这是因为函数定义与父类不匹配。有一个父类用 3 个参数定义 getModel。这已通过您发布的代码进行了扩展,该代码仅使用两个参数定义了 getModel。

解决方案是更新函数定义以匹配父级。这将使错误消失,但也可能误导未来的开发人员,他们可能期望这些额外的参数会产生影响或以非预期的方式使用该函数;至少尝试通过使用不祥的参数名称来缓解这​​种情况:

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

【讨论】:

  • 对于我给出的最后一个示例,显示的第二个参数通常是 $urlparams,从它看来,Joomla 严重依赖它......我是否应该每次都将 True 作为参数传递 display()叫做?目前,此客户端站点中的每次 display() 调用仅使用单个参数进行调用。
  • 如果在函数定义中指定了默认参数,那么每次调用函数时都不需要传递。
猜你喜欢
  • 2013-11-07
  • 2013-05-10
  • 2013-08-28
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多