我有一个使用递归调用自身的函数,我需要知道调用自身的正确语法。
注意:我使用的是面向对象的编程技术,该函数来自类文件。
以下是我的功能
// Generate Unique Activation Code
//*********************************************************************************
public function generateUniqueActivationCode()
{
$mysql = new Mysql();
$string = new String();
$activation_code = $string->generateActivationCode();
// Is Activation Code Unique Check
$sql = "SELECT activation_id FROM ". TABLE_ACTIVATION_CODES ." WHERE activation_code='$activation_code' LIMIT 1";
$query = $mysql->query($sql);
if($mysql->rowCount($query) > 0)
{
// This function is calling itself recursively
return generateUniqueActivationCode(); // <- Is this syntax correct in Oops
}
else
{
return $activation_code;
}
}
代码是否应递归调用
return generateUniqueActivationCode();
OR
return $this->generateUniqueActivationCode();
或者除了这两种方式之外的其他东西。
请告诉我。
答案 0 :(得分:1)
您需要使用$ this变量调用它,因为您的函数是实例的一部分。所以:
return $this->generateUniqueActivationCode();
PS:为什么不尝试这两种方法并查看它是否会产生任何错误?
答案 1 :(得分:0)
递归是解决这个问题的完全错误的方法
与迭代不同,你正在填充堆栈,并且不必要地生成新对象。
解决问题的正确方法是在范围内生成一个随机值,这使得重复项不太可能,但是如果没有一些外部量词(例如用户名)来定义范围,那么迭代就是可行的方法。
您的代码还有其他问题 - 实际上您应该在检查记录的位置添加记录。
我正在使用面向对象的编程技术,该函数来自类文件
然后它不是一个函数,它是一种方法。
您的代码易受SQL注入攻击。
更好的解决方案是:
class xxxx {
....
public function generateUniqueActivationCode($id)
{
if (!$this->mysql) $this->mysql = new Mysql();
if (!$this->string) $this->string = new String();
$limit=10;
do {
$activation_code = $string->generateActivationCode();
$ins=mysql_escape_string($activation_code);
$sql="INSERT INTO ". TABLE_ACTIVATION_CODES ." (activation_id, activation_code)"
. "VALUES ($id, '$ins)";
$query = $mysql->query($sql);
if (stristr($query->error(), 'duplicate')) {
continue;
}
return $query->error() ? false : $activation_code;
} while (limit--);
return false;
}
} // end class