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

または、これらの2つの方法以外の場合。

私にお知らせください。

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 に答える