0

我有一个使用递归调用自身的函数,我需要知道调用自身的正确语法。

注意:我使用的是面向对象的编程技术,函数来自类文件。

下面是我的功能

// 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();

或者

return $this->generateUniqueActivationCode();

或者如果不是这两种方式。

请告诉我。

4

2 回答 2

1

您需要使用 $this 变量调用它,因为您的函数是实例的一部分。所以:

return $this->generateUniqueActivationCode();

PS:为什么不尝试这两种方法,看看它是否会产生任何错误?

于 2012-12-18T07:48:52.967 回答
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
于 2012-12-18T10:05:01.250 回答