我有一个主要功能,里面有另一个功能,它与多个功能有很大关系。我需要在某些条件满足时终止第二个函数。这本身就来自于那些内部功能的结果。那么,我怎样才能终止第二个不影响正在运行的主函数的函数。我了解die
和exit
。然而,这两个,终止整个过程。
function main($string) {
//some code here...
function second($content) {
//more code...
inner_one($evaluate);
//need to stop second function if some criteria met here, but the rest of the "main function" should run normally
}
//more codes...
}
function inner_one($evaluate) {
//some evaluation here
//the result of this function should make "second function" stop or allow running
}
如果我在内部函数中使用die
或exit
,则整个过程都会失败。如何让它工作?
答案 0 :(得分:1)
希望你能从这里得到想法。
function main($string) {
//some code here...
function second($content) {
//more codes
$status=inner_one($evaluate);
if(!$status)//if your inner_one does not run successfully return false
{
return false;
}
//write your other codes for second
//return false if it gets any error
//more codes
return true;
}
//more codes...
}
function inner_one($evaluate) {
//your codes going here
//if you find some error return false
/// ............
return true;//at the end
}
答案 1 :(得分:0)
为此,您应该取出second
功能,使其成为外部功能。然后在内部函数上使用return
。 die
和exit
非常罕见。通常仅用于错误处理,例如当整个应用程序确实需要完全停止时。
对于此特定代码,您应该添加一个返回值,检查是否需要退出。
答案 2 :(得分:0)
回想一下,当你写:
function foo(){
// code....
}
您定义函数foo
。除非调用,否则不会执行此函数,可以用不同的方式编写。
直接:
foo();
或者通过使用PHP的现有函数(call_user_func
),或者将函数的名称赋给变量并将该变量用作函数:
$fun = 'foo';
$fun(); // calls foo
函数定义可能出现在语句有效的PHP代码中的任何位置。这意味着代码片段中写的second
是一个函数定义,可以从程序中的任何其他位置看到。微妙的一点是,当main
执行(*)时,此定义只会启用,而不是在全局范围内具有该功能定义(外部)任何其他功能或类别。)
虽然这是一个非常强大的功能,但除非你想确保在main
可用之前执行second
,或者你想在运行时在{{{的几个定义中选择一个定义。 1}},我建议避免将函数定义放在其他函数定义中。
现在,当您调用second
时,您的函数将像任何其他常规PHP函数一样运行,因此只需使用second
表示您希望执行流程离开函数(即, PHP解释器退出函数并在调用return
)后继续运行到下一条指令。
second
和exit
确实是中断PHP脚本执行的指令,可以在指令有效的任何地方使用。
实现需求的一种简单方法是让die
返回一个可以解释为布尔值的值 - 最简单的当然是直接使用布尔值:
inner_one
或更有效:
function inner_one($evaluate){
// some computation yielding $some_state
if ($some_state == SOME_GOOD_VALUE)
return true;
else return false;
}
然后, function inner_one($evaluate){
// some computation
return ($some_state == SOME_GOOD_VALUE);
}
可以通过遵循类似的算法相应地对该返回值起作用:
second
或者,为了避免太多的代码嵌套:
function second(){
// some computation
if (inner_one($evaluate)){
// carry on computation
}
}
(*),只要执行流程对其进行了评估,就会启用任何定义,这就解释了为什么你可以在其他人中编写函数并拥有这种简洁的机制