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

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

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

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

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

这是我的功能:

函数- PHP

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

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

    echo $arg + $arg2;
}

我试过这样做:

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

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

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

有人能提供解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

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

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

1.可选参数

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

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

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

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

2.参考

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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
运行
AI代码解释
复制
<?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 03:21:57

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

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

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

    echo $arg + $arg2;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
function returnZeroAdd ($arg = 0, $arg2 = 0)
{
    echo $arg + $arg2;
}
票数 0
EN

Stack Overflow用户

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

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

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

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

returnZeroAdd($bawtryReturnCount);

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

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

https://stackoverflow.com/questions/26015539

复制
相关文章
sql连接查询和嵌套查询_sql子查询和连接查询
【例二】:查询 JAVA第一学年 课程成绩排名前十的学生 并且分数要大于80 的学生信息(学号、姓名、课程名称、分数)
全栈程序员站长
2022/09/22
4.4K0
sql连接查询和嵌套查询_sql子查询和连接查询
Linux/Unix shell 参数传递到SQL脚本
      在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性。而shell 脚本参数作为变量传递给SQL以及SQL脚本也是DBA经常碰到的情形之一。本文主要讨论了如何将shell脚本的参数传递到SQL脚本之中并执行SQL查询。   有关shell与SQL之间的变量传递,请参考:  Linux/Unix shell sql 之间传递变量
Leshami
2018/08/14
2K0
从SocketTimeoutException到全连接队列和半连接队列
大概在一年半之前的时候,我们的应用的某个业务开始间歇报SocketTimeoutException, 不是前端调用我们发生SocketTimeoutException,而是我们用 HTTP Client中台拉取数据的时候,会偶尔报SocketTimeException, 这个偶尔可能是一个月报一次,也可能是两个月报一次,可能一个星期报两次,频率不固定,次数也不固定,当我第一次看到这个异常的时候,我的第一个反应就是用这个异常信息去搜索引擎上搜索解决方案,我并不理解这个异常说明了什么,但是按照我以往的经验来说,一般都有解决方案,对搜索引擎的方案一般都是延长超时时间,于是我延长了超时时间,但这并没有根本上解决问题,还是会出问题。延长超时时间不管用之后,我就扩容,但是扩容依然也不管用,我当时在尝试复现这个异常的时候,也忽略了一些东西,然后导致我在测试无法复现,能够复现的问题都是好问题,我之前面试的时候也背过三次握手,也学过Java 的原生Socket 编程,Netty,我背过Tomcat的acceptCount参数,但是碰到这个问题,这些知识仍然没有帮我解决问题,原因当时我网络的知识没有连接起来,他们孤零零的,向孤零零的神经元一样,没建立起来连接,最后这个问题开始让这些知识开始建立连接,成体系的发展。连接才是有价值的。
fliter
2023/10/09
5140
从SocketTimeoutException到全连接队列和半连接队列
从Python传递参数到C++
有些场景下,需要将Python里面计算得到的参数或者结果传入到C++来进行工程部署。一个常见问题是,Python该以什么格式 (二进制还是文本) 保存这些参数,然后从C++代码里面来读取呢,各有什么优劣?这里我们简单实验一下,并写一些趁手的代码,供查阅。
王云峰
2023/10/21
3400
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
Mysql状态信息查询--连接相关
查看连接线程相关的系统变量的设置值 show variables like 'thread%';
陈不成i
2021/06/15
1.4K0
Golang函数参数的值传递和引用传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
仙人技术
2021/08/31
2.5K0
Golang函数参数的值传递和引用传递
java之方法的参数传递(值传递和引用传递)
基础数据类型参数传递方式只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响;
西西嘛呦
2020/08/26
2.1K0
《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
       关于这个知识点,我想了很久该不该在这里阐述。因为这个知识点稍微有点晦涩,并且就算不了解也不影响用Java编写代码。不过笔者刚开始工作的时候,就是因为这块内容没有过多的关注,以至于相当于长一段时间对这块内容都模糊不清甚至误解。我相信你们都比我悟性高,因此决定还是先拿出来讨论。
用户7801119
2020/09/27
1.1K0
SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]
INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T1′, N’李力 ‘, N’男’, 47, N’教授 ‘, 1800, 3000, N’计算机 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T2′, N’王平 ‘, N’女’, 28, N’讲师 ‘, 850, 1200, N’信息 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T3′, N’刘伟 ‘, N’男’, 30, N’讲师 ‘, 900, 1200, N’计算机 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T4′, N’张雪 ‘, N’女’, 51, N’教授 ‘, 1900, 3000, N’自动化 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T5′, N’张兰 ‘, N’女’, 39, N’副教授 ‘, 1300, 2000, N’信息 ‘) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C1′, N’程序设计 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C2′, N’微机原理 ‘, 80) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C3′, N’数字逻辑 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C4′, N’数据结构 ‘, 80) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C5′, N’数据库 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C6′, N’编译原理 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C7′, N’操作系统 ‘, 60) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T1′, N’C1′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T1′, N’C4′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T2′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T3′, N’C1′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T3′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T4′, N’C2′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T4′, N’C3′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T5′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T5′, N’C7′, NULL) GO INSERT [dbo].[S] ([SNO], [SN], [SEX], [AGE], [DEPT]) V
全栈程序员站长
2022/08/23
2.3K0
SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]
从VBA的vbNullString认识API参数传递
最近在写个简单的程序时,用到了API FindWindow,复制声明后,直接就把代码写了,可是发现一直找不到窗口,代码:
xyj
2021/03/18
1.8K0
js从 URL 获取查询参数
从 URL 获取查询参数 <script> function getParameterByName(name, url) { if (!url) url
江一铭
2022/06/16
10.5K0
从ajax获取参数到控制器Laravel
route Route::get('search', 'ShowstaffController@search'); 接收变量
双面人
2020/02/17
1.2K0
从 AI 到 信息安全
如果把AI算法用来做个性化推荐,那么算法和被推荐对象会是一种 “相互取悦” 的关系,被推荐者一定希望推荐给他的是他需要的(在隐私保护做的好的前提下),算法也努力试图去计算出被推荐者真正需要的东西,二者是同向而行,或者至少,被推荐对象不会躲着AI走(推荐给我不需要的东西,什么心态?)。 但是算法用来做安全对抗就完全不一样了,算法努力计算出攻击者画像、预测出攻击者的行为,而攻击者则努力规避算法的计算,试图通过各种方式绕开AI的猜测,于是变成了一场对抗。 这是AI算法应用在信息安全的客观情况,包括网络入侵、帐号
数说君
2022/08/25
6040
从 AI 到 信息安全
FastAPI从入门到实战(5)——查询参数与字符串校验
在大多数情况下,需要某些东西时,可以简单地省略 default 参数,因此你通常不必使用 ... 或 Required
MinChess
2022/12/27
6360
FastAPI从入门到实战(5)——查询参数与字符串校验
如何从SharePoint Content DB中查询List数据
SharePoint用来维护基础数据非常方便,只需要建立自定义列表,然后使用InfoPath自定义一下维护界面,就可以实现在线的增删改查,开发效率很高。如果维护的数据需要进行审批,还可以加入工作流功能。使用SharePoint Designer可以快速开发出简单的工作流,如果是很复杂的工作流,那么就需要使用VS进行开发了。现在数据已经维护进了SharePoint List,那么怎么从数据库中将维护的数据查询出来呢?
深蓝studyzy
2022/06/16
3.1K0
从信息熵到Codec
过去几个月,我常常思考一个问题——多媒体(通信)技术到底解决什么问题?交付什么样的服务呢?目前得到的答案是:
LiveVideoStack
2021/09/01
2510
sql sever分组查询和连接查询
分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列名和聚合函数同时出现,要么在聚合函数中出现,要么就使用分组进行查询) having 条件    分组筛选(一般和group by连用,位置在其后) where:用来筛选from子句指定的操作所产生的行 group by:用来分组where子句输出 having:用来从分组的结果中筛选行 1.分组查询是针对表中不同的组分类统计和输出的 2.having
房上的猫
2018/03/14
2.2K0
MyBatis快速入门——第二章、参数传递demo(id查询&模糊查询)
【#】会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理。
红目香薰
2022/11/30
4050
MyBatis快速入门——第二章、参数传递demo(id查询&模糊查询)
点击加载更多

相似问题

如何将参数从控制器传递到视图,视图传递到控制器?

10

iOS -如何将信息从视图传递到控制器?

22

如何将参数从控制器传递到模板?

23

如何将参数从视图传递到控制器?

111

如何将参数从控制器传递到服务

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文