首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用户定义函数- PHP的意外结果

用户定义函数- PHP的意外结果
EN

Stack Overflow用户
提问于 2014-09-24 11:15:56
回答 5查看 62关注 0票数 0

我试图编写一个简单的函数,它接受两个参数,将它们相加并返回计算结果。

在执行计算之前,函数检查这两个参数中的任何一个是否未定义,如果是,则将参数设置为0

这是我的功能:

函数- PHP

代码语言:javascript
代码运行次数:0
运行
复制
function returnZeroAdd ($arg, $arg2)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

    if(!isset($arg2))
    {
        $arg2 = 0;
    }

    echo $arg + $arg2;
}

我试过这样做:

代码语言:javascript
代码运行次数:0
运行
复制
returnZeroAdd($bawtryReturnCount, $bawtryFReturnCount);

但这会引发一个undefined variable $bawtryFReturnCount错误。

我不知道为什么函数在执行计算之前不将$bawtryFReturnCount)设置为0,从而消除了“未定义变量”错误。

有人能提供解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-24 11:21:42

你不能用你想要的方式做这件事。一旦使用了未定义的变量,就会得到这个错误。因此,错误并不发生在函数内部,而是已经发生在对函数的调用中。

1.可选参数

您可以使一个参数是可选的,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    return $arg + $arg2;
}

这样,参数是可选的,您可以像这样调用函数:

代码语言:javascript
代码运行次数:0
运行
复制
echo returnZeroAdd(); // 0
echo returnZeroAdd(1); // 1
echo returnZeroAdd(1, 1); // 2

2.参考

但我不确定这是不是你想要的。这一呼吁仍将失败:

代码语言:javascript
代码运行次数:0
运行
复制
echo returnZeroAdd($undefinedVariable);

这可以通过引用传递变量来解决。然后,您可以检查是否设置了这些值,如果是的话,在加法中使用它们。

代码语言:javascript
代码运行次数:0
运行
复制
<?php
function returnZeroAdd (&$arg, &$arg2)
{
    $result = 0;
    if(isset($arg))
    {
        $result += $arg;
    }

    if(isset($arg2))
    {
        $result += $arg2;
    }

    return $result;
}

echo returnZeroAdd($x, $y);

请注意,如果在函数中更改了by引用参数的原始值,则实际上将更改它的原始值。这就是为什么我改变代码的方式,使参数本身不被修改。看看这个简化的例子,看看我的意思:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
function example(&$arg)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

    return $arg;
}

echo example($x); // 0
echo $x // also 0

当然这可能是你的意图。如果是这样,您可以在函数中安全地将$arg和$arg2设置为0。

票数 2
EN

Stack Overflow用户

发布于 2014-09-24 11:21:57

如果您真的想在函数中进行检查,可以通过引用传递参数:

代码语言:javascript
代码运行次数:0
运行
复制
function returnZeroAdd (&$arg, &$arg2)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

    if(!isset($arg2))
    {
        $arg2 = 0;
    }

    echo $arg + $arg2;
}

但是,这可能会修改函数之外的参数,如果这不是您想要做的,那么您需要这样做:

代码语言:javascript
代码运行次数:0
运行
复制
function returnZeroAdd (&$arg, &$arg2)
{
    if(!isset($arg))
    {
        $localArg = 0;
    }
    else
    {
        $localArg = $arg;
    }

    if(!isset($arg2))
    {
        $localArg2 = 0;
    }
    else
    {
        $localArg2 = $arg2;
    }

    echo $localArg + $localArg2;
}

您现在可以传递未定义的变量,它不会抛出任何错误。

或者,您可能希望为您的参数提供一个默认值(在您的例子中,0似乎是合适的):

代码语言:javascript
代码运行次数:0
运行
复制
function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    echo $arg + $arg2;
}
票数 0
EN

Stack Overflow用户

发布于 2014-09-24 11:21:57

错误不是由函数本身引发的,因为函数不知道全局范围。即使在函数执行之前,也会抛出错误,而PHP试图将$bawtryFReturnCount传递给函数,却找不到它,并抛出错误,但是,它不是致命的错误,执行也没有停止。THerefore,函数是使用一个默认值为null的非set变量执行的,在这里,isset将不能工作,因为参数是强制性的,但不是可选的。更好的检查是empty($arg),但是错误仍然存在。

因为函数不知道也不应该知道应用程序的全局状态,所以您应该从函数外部执行这些检查,然后调用它。

代码语言:javascript
代码运行次数:0
运行
复制
if (!isset($bawtryReturnCount)) {
    $bawtryReturnCount = 0
}

returnZeroAdd($bawtryReturnCount);

或者将默认值赋给函数中的参数,使它们是可选的,而不是强制的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26015539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档