在php中递归调用函数的正确语法是什么

时间:2012-12-18 07:46:16

标签: php function

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

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

以下是我的功能

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

或者除了这两种方式之外的其他东西。

请告诉我。

2 个答案:

答案 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