PHP问题:私有方法返回值赋值给私有变量始终为null
问题分析与解决方案
问题根源
问题出在generate_user_url方法的递归调用逻辑中:当检测到URL已存在(else分支),你递归调用了$this->generate_user_url(),但没有返回这个递归调用的结果。这导致上层函数无法获取到递归最终生成的有效URL,最终返回null。
而第二次调用$my_url = $this->generate_user_url()能正常获取结果,是因为第一次递归已经修改了类属性$user_url_extension,第二次调用时生成的URL大概率已经唯一,不需要进入递归分支,直接执行return返回了结果。
修复代码
修改generate_user_url的else分支,添加return语句:
private function generate_user_url(){ preg_match('/\@(.*?)\./s', $this->email, $school_identifier); $first_character_first_name = mb_substr($this->first_name, 0, 1); $temp_user_url = $first_character_first_name.$this->last_name.'@'.$school_identifier[1].$this->user_url_extension; $stm = $this->pdo->prepare('SELECT user_url from hm_users WHERE user_url=:user_url'); $stm->bindParam(':user_url', $temp_user_url); $stm->execute(); $res = $stm->fetch(PDO::FETCH_ASSOC); if(!$res){ return $temp_user_url; } else{ $this->user_url_extension = strval(rand(1, 999)); // 关键:返回递归调用的结果 return $this->generate_user_url(); } }
额外优化建议
$user_url_extension是类私有属性,多次调用create_user时会保留之前的值,可能导致后续生成的URL带不必要的后缀。建议将其改为方法内的局部变量,或者在create_user方法开头重置为空字符串:
public function create_user(){ $this->user_url_extension = ''; // 重置后缀 $this->user_url = $this->generate_user_url(); // ... }
- 递归生成随机后缀存在重复概率(虽然低),可以改为自增数字或者更可靠的唯一标识生成逻辑,避免无限递归风险。
内容的提问来源于stack exchange,提问作者Paul Tennant
相关产品推荐
相关产品推荐

