PHP & 和 Joomla 的严重错误
PHP Strict errors with & and Joomla
我正在帮助客户解决一些问题,据我所知,这些问题是在他们更新到 PHP 5.5(Joomla 当前为 2.5.20)后出现的。这些错误是从一些归因于 Joomla CMS 的行中抛出的(尽管我认为这不是原因)。不管怎样,这里有一些代码片段和它们各自的错误,我需要帮助:
$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 个参数,所以我不确定为什么这是个问题。
任何有用的提示或解决方案将不胜感激。
谢谢。
作为一般规则,我总是建议不要更改供应商代码。将来可能会因供应商更新而变得复杂。考虑符合供应商期望的较低版本 PHP 是否合适,或者研究分叉供应商源存储库以便将来的供应商更新可以合并。
回答你的问题:
第一个错误:
PHP Strict Standards: Only variables should be assigned by reference...
在PHP中,&
常用于为项目分配别名。这使得一项可能会更改的项目被称为多个名称,有时可能很有用。它也曾经在 PHP 中使用,以便在对同一项目使用不同名称时提高效率,因为 PHP 过去常常在每次为某物分配新名称时制作副本。
PHP 在后一种情况下的效率得到了显着提高,因为 v5 和 PHP 强烈鼓励使用 &
仅在变量别名且仅在有意义时使用从逻辑上讲,出于代码的目的,函数的 return 值不能使用别名,因为从逻辑上讲,它位于不再存在的函数的局部范围内。
所以是的,在函数调用中用 =
替换 =&
很可能是安全的。
第二个错误:
getModel() should be compatible with JController::getModel($name = '',
$prefix = '', $config = Array)
这是因为函数定义与父函数定义不匹配 class。有一个父 class 定义了带有 3 个参数的 getModel。您发布的代码对此进行了扩展,该代码仅使用两个参数定义了 getModel。
解决方案是更新函数定义以匹配父级。这将使错误消失,但也可能误导未来的开发人员,他们可能期望这些额外的参数会产生影响或以非预期的方式使用该功能;至少尝试通过使用不祥的参数名称来缓解这种情况:
public function getModel($name = 'Submission', $prefix = 'AwardAdminModel', $unused = array())
{
$model = parent::getModel($name, $prefix, array('ignore_request' => true));
return $model;
}
我正在帮助客户解决一些问题,据我所知,这些问题是在他们更新到 PHP 5.5(Joomla 当前为 2.5.20)后出现的。这些错误是从一些归因于 Joomla CMS 的行中抛出的(尽管我认为这不是原因)。不管怎样,这里有一些代码片段和它们各自的错误,我需要帮助:
$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 个参数,所以我不确定为什么这是个问题。
任何有用的提示或解决方案将不胜感激。
谢谢。
作为一般规则,我总是建议不要更改供应商代码。将来可能会因供应商更新而变得复杂。考虑符合供应商期望的较低版本 PHP 是否合适,或者研究分叉供应商源存储库以便将来的供应商更新可以合并。
回答你的问题: 第一个错误:
PHP Strict Standards: Only variables should be assigned by reference...
在PHP中,&
常用于为项目分配别名。这使得一项可能会更改的项目被称为多个名称,有时可能很有用。它也曾经在 PHP 中使用,以便在对同一项目使用不同名称时提高效率,因为 PHP 过去常常在每次为某物分配新名称时制作副本。
PHP 在后一种情况下的效率得到了显着提高,因为 v5 和 PHP 强烈鼓励使用 &
仅在变量别名且仅在有意义时使用从逻辑上讲,出于代码的目的,函数的 return 值不能使用别名,因为从逻辑上讲,它位于不再存在的函数的局部范围内。
所以是的,在函数调用中用 =
替换 =&
很可能是安全的。
第二个错误:
getModel() should be compatible with JController::getModel($name = '', $prefix = '', $config = Array)
这是因为函数定义与父函数定义不匹配 class。有一个父 class 定义了带有 3 个参数的 getModel。您发布的代码对此进行了扩展,该代码仅使用两个参数定义了 getModel。
解决方案是更新函数定义以匹配父级。这将使错误消失,但也可能误导未来的开发人员,他们可能期望这些额外的参数会产生影响或以非预期的方式使用该功能;至少尝试通过使用不祥的参数名称来缓解这种情况:
public function getModel($name = 'Submission', $prefix = 'AwardAdminModel', $unused = array())
{
$model = parent::getModel($name, $prefix, array('ignore_request' => true));
return $model;
}