Php 递归函数返回null,但在var dump上返回一个值

Php 递归函数返回null,但在var dump上返回一个值,php,Php,我正在创建一个函数,它将根据输入的字符串返回一个slug,如果数据库中存在slug,它将附加一个带-$num的数字,我使用的是codeigniter 当我关闭变量时,它在_generate_slug上返回正确的slug,它返回正确的值,但当我关闭索引函数时,它返回空白 这是我的函数 controllers/test.php public function index() { echo $this->_generate_slug('test'); } protected functio

我正在创建一个函数,它将根据输入的字符串返回一个slug,如果数据库中存在slug,它将附加一个带-$num的数字,我使用的是codeigniter

当我关闭变量时,它在_generate_slug上返回正确的slug,它返回正确的值,但当我关闭索引函数时,它返回空白

这是我的函数

controllers/test.php

public function index()
{
  echo $this->_generate_slug('test');
}

protected function _generate_slug($string,$cntr = 0)
{
  if($cntr == 0){

        $slug = create_slug($string);

   }else{

        $slug = create_slug($string).'-'.$cntr;

   }   

   if($this->test_model->slug_exist($slug)){
        $cntr++;
        $this->_generate_slug($string,$cntr);

    }else{

        return $slug;  
    }    
}
function create_slug($string)
{
    $slug = strtolower( $string );
    $slug = str_replace('&','and',$slug);
    $slug = preg_replace('/[%\'"``]/', '', $slug);
    $slug = preg_replace('/[^a-zA-Z0-9-]/','-',$slug);
    $slug = preg_replace("/[-]+/", "-", $slug);
    $slug = trim($slug, '-');

    return $slug;
}
helpers/test.php

public function index()
{
  echo $this->_generate_slug('test');
}

protected function _generate_slug($string,$cntr = 0)
{
  if($cntr == 0){

        $slug = create_slug($string);

   }else{

        $slug = create_slug($string).'-'.$cntr;

   }   

   if($this->test_model->slug_exist($slug)){
        $cntr++;
        $this->_generate_slug($string,$cntr);

    }else{

        return $slug;  
    }    
}
function create_slug($string)
{
    $slug = strtolower( $string );
    $slug = str_replace('&','and',$slug);
    $slug = preg_replace('/[%\'"``]/', '', $slug);
    $slug = preg_replace('/[^a-zA-Z0-9-]/','-',$slug);
    $slug = preg_replace("/[-]+/", "-", $slug);
    $slug = trim($slug, '-');

    return $slug;
}

您得到的是
NULL
,因为您在递归中没有返回值。应该是:

return $this->_generate_slug($string,$cntr);
但正如评论中提到的,这里使用递归很奇怪


此外,我不熟悉CodeIgniter中的代码样式,但以下划线开头命名受保护的方法似乎是一种不好的做法。

为什么需要使用递归?在学术界以外,我通常认为没有理由这样做。你有没有试过反复这样做来排除这种可能性?