【问题标题】:Small PHP error Too few arguments to function on php72PHP 小错误 参数太少,无法在 php72 上运行
【发布时间】:2018-12-19 07:54:59
【问题描述】:

我需要帮助解决我的 php 脚本在 php7.2 上工作的一个小问题,下面的代码适用于 php7.0 但不适用于 php7.1 或 7.2 :(

调试时显示错误:

    ArgumentCountError: Too few arguments to function smarty_function_gravatar(), 1 passed and exactly 2 expected in public_html/includes/hooks/custom-function.php: Line 91


Stack trace:
    #0 /public_html/includes/hookfunctions.php(0): smarty_function_gravatar(Array)
    #1 /public_html/includes/clientareafunctions.php(0): run_hook('ClientAreaPage', Array)
    #2 /public_html/login.php(0): outputClientArea('login', false, Array)
    #3 /public_html/member/viewticket.php(0): unknown()
    #4 {main}

我在第 91 行的原始代码:

 function smarty_function_gravatar($params, &$smarty) {
    $email = (isset($params['email']) ? trim(strtolower($params['email'])) : '');
    $rating = (isset($params['rating']) ? $params['rating'] : 'R');
    $url = "https://www.gravatar.com/avatar/".md5($email) . "?r=".$rating;

    if(isset($params['default']))
        $url .= "&d=".urlencode($params['default']);
    if(isset($params['size']))
        $url .= "&s=".$params['size'];

    if(isset($params['assign'])) {
        $smarty->assign($params['assign'], $url);
        return;
    }
    return $url;
 }

关于模板 .tpl

<img src="{gravatar email="{if $reply.name eq 'Admin 1'}admin1@domain.com{elseif $reply.name eq 'Admin 2'}admin2@domain.com{elseif $reply.name eq 'Admin 3'}admin3@domain.com{elseif $reply.name eq 'Admin 4'}admin4@domain.com{/if}" size="140"}" height="60" width="60">

{elseif $reply.contactid} <img src="{gravatar email="$replyemail" size="140"}" height="60" width="60">

{elseif $reply.userid} 
<img src="{gravatar email="$replyemail" size="140" default="/default-avatar.png"}" height="60" width="60">
{else} 
<img src="{gravatar email="$replyemail" size="140" default="/default-avatar.png"}" height="60" width="60">

【问题讨论】:

  • 你传递了多少参数给smarty_function_gravatar()?该消息建议使用 0 或 1 而不是 2。
  • 1 passed and exactly 2 expected 一...我认为错误很明显。
  • @ggdx 我更新了帖子

标签: php smarty php-7.1 whmcs php-7.2


【解决方案1】:

在 PHP/7.0 之前,缺少参数只会触发警告,但从 PHP/7.1 开始,它们会引发致命错误 (demo)。来自7.0 migration guide

以前,如果使用太少的参数调用用户定义的函数,则会发出警告。现在,此警告已升级为错误异常。此更改仅适用于用户定义的函数,而不适用于内部函数。

很可能它从未真正起作用,但您已将 PHP 配置为隐藏错误信息——这对于致命错误不再有用,因为它们无论如何都会中止执行。

因为你从不使用函数的第二个参数,所以完全摆脱它。

【讨论】:

  • 抱歉我不太明白,给个建议是删代码还是加代码
  • 请检查马丁的回答。我认为它不是自定义函数,而是为旧版本设计的某种 Twig 插件。
【解决方案2】:

kevinpapst.de(德语);它是从 2008 年开始的,语法也是如此......

同时documentation 说了一些关于“编写插件”的内容:

作为一般规则,当前评估的模板的Smarty_Internal_Template 对象总是作为最后一个参数传递给插件,但有两个例外:

  • 修饰符根本没有通过Smarty_Internal_Template 对象。

  • Smarty_Internal_Template 对象之后通过 $repeat 块来保持与旧版本 Smarty 的向后兼容性。

例如:

function smarty_function_gravatar(array $params, Smarty_Internal_Template $template) {

    $email = (isset($params['email']) ? trim(strtolower($params['email'])) : '');
    $rating = (isset($params['rating']) ? $params['rating'] : 'R');

    $url = "https://www.gravatar.com/avatar/".md5($email) . "?r=".$rating;
    if(isset($params['default'])) {
        $url .= "&d=".urlencode($params['default']);
    }
    if(isset($params['size'])) {
        $url .= "&s=".$params['size'];
    }
    if(isset($params['assign'])) {
        $template->smarty->assign($params['assign'], $url);
        return;
    }
    return $url;
}

同用:

{gravatar email="example@example.com" size="60" rating="X" assign="gravatarURL" default="http://www.example.com/default_gravatar.jpg"}

<img src="{$gravatarURL}" height="60" width="60">

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 2017-12-05
    • 2020-06-06
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多