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

时间:2014-09-24 11:15:57

标签: php

我试图编写一个带有两个参数的简单函数,将它们加在一起并返回计算结果。

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

这是我的功能:

功能 - PHP

function returnZeroAdd ($arg, $arg2)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

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

    echo $arg + $arg2;
}

我试图像这样执行它:

returnZeroAdd($bawtryReturnCount, $bawtryFReturnCount);

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

我不知道为什么函数在执行计算之前没有将$bawtryFReturnCount)设置为0,从而否定了未定义的变量'错误。

任何人都可以提供解决方案吗?

5 个答案:

答案 0 :(得分:2)

你不能按照你想要的方式做到这一点。只要使用未定义的变量,就会出现此错误。因此,错误不会发生在您的函数内部,但已经发生在对函数的调用中。

<强> 1。可选参数

您可以将参数设为可选参数,如下所示:

function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    return $arg + $arg2;
}

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

echo returnZeroAdd(); // 0
echo returnZeroAdd(1); // 1
echo returnZeroAdd(1, 1); // 2

<强> 2。参考

但我不确定这是不是你想要的。此调用仍将失败:

echo returnZeroAdd($undefinedVariable);

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

<?php
function returnZeroAdd (&$arg, &$arg2)
{
    $result = 0;
    if(isset($arg))
    {
        $result += $arg;
    }

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

    return $result;
}

echo returnZeroAdd($x, $y);

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

<?php
function example(&$arg)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

    return $arg;
}

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

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

答案 1 :(得分:0)

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

function returnZeroAdd (&$arg, &$arg2)
{
    if(!isset($arg))
    {
        $arg = 0;
    }

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

    echo $arg + $arg2;
}

然而,这可能会修改你的函数以外的参数,如果它不是你想要的,那么你需要这个:

function returnZeroAdd (&$arg, &$arg2)
{
    if(!isset($arg))
    {
        $localArg = 0;
    }
    else
    {
        $localArg = $arg;
    }

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

    echo $localArg + $localArg2;
}

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

或者你可能想给你的参数一个默认值(在你的情况下0似乎合适):<​​/ p>

function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    echo $arg + $arg2;
}

答案 2 :(得分:0)

函数本身不会抛出错误,因为函数不知道全局范围。甚至在执行函数之前抛出错误,而PHP interperter试图将$bawtryFReturnCount传递给函数,没有找到它,并抛出错误,但是,它不是致命的,执行没有停止。因此,该函数使用默认值为null的非set变量执行,我猜,isset将不起作用,因为参数是必需的,但不是可选的。这里更好的检查是empty($arg),但错误仍然存​​在。

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

if (!isset($bawtryReturnCount)) {
    $bawtryReturnCount = 0
}

returnZeroAdd($bawtryReturnCount);

或者为函数中的参数指定默认值,使其成为可选而非强制。

答案 3 :(得分:0)

您的功能可以改写为:

function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    echo $arg + $arg2;
}

你错过了变量如何运作。由于在调用函数时未定义$bawtryFReturnCount;你收到警告您的isset-checks执行检查太晚了。例如:

$bawtryReturnCount = 4;
$bawtryFReturnCount = 0;

returnZeroAdd($bawtryReturnCount, $bawtryFReturnCount);

不会导致错误。

答案 4 :(得分:0)

在将变量传递给函数之前,必须先定义变量。例如

     $bawtryReturnCount=10;
     $bawtryFReturnCount=5;
   define the two variable with some value and pass it to that function.
     function returnZeroAdd ($arg=0, $arg2=0)
     {

       echo $arg + $arg2;
     }

如果定义这样的函数,则表示如果未传递参数,则函数将默认值设为0。 例如,您可以像这样调用函数          returnZeroadd(); // print 0          returnZeroadd(4); // print 4          returnZeroadd(4,5); // print 9     或者你可以定义两个变量并将其作为参数传递并像这样调用。

     $bawtryReturnCount=10;
     $bawtryFReturnCount=5;
     returnZeroadd($bawtryReturnCount, $bawtryFReturnCount);