PHP调用方法里面的方法

问题描述 投票:1回答:1

PHP学生在这里考虑以下2种方法,1方法检查用户是否存在其他注册用户。

public function is_registered($userEmail) 
{
   $this->email = $userEmail;

   $sql = "SELECT * from users WHERE email = :email";

   $stmnt = $db->prepare($sql);
   $stmnt->bindValue(':email', $userEmail);

   $check = $stmnt->execute();

   if($check >= 1) {
      return true;
   }
   else {
      return false;
   }
}


public function register_user($email, $pword, $firstname, $lastname)
{
   $this->email = $email;

   //call method is_registered inside register user class
   $registered = $this->is_registered($email);

   if($registered == true){
      die("USER EXISTS");
   }
   else {
      //continue registration
   }

 }

虽然这可能不是最好的用例,但我基本上想知道:

  1. 在方法中调用方法是“正常/良好实践”。另一个用例可能是在get_email()方法或类似方法中调用login()方法,您需要一个电子邮件地址。
  2. 如果我在方法中设置属性或直接访问传递的参数有什么区别?例:

具有set属性的方法

public function is_registered($userEmail)
{
   $this->email = userEmail // SET PROPERTY

   $sql = "SELECT * from users WHERE email = :email";
   $stmnt = $db->prepare($sql);
   $stmnt->bindValue(':email', $userEmail);
}

没有设置属性的方法。

public function is_registered($userEmail) 
{
   //NO SET PROPERTY
   $sql = "SELECT * from users WHERE email = :email";
   $stmnt = $db->prepare($sql);
   $stmnt->bindValue(':email', $userEmail);
}

希望这是有道理的,任何帮助或指导非常感谢。

php
1个回答
1
投票

OOP的角度来看,这两种方法都有点奇怪。由于你的User类似乎不是静态的,并且因为电子邮件地址是认证的主要唯一性判别之一,所以你的类应该用一个永远不会改变的valorized email属性来实例化...或者在数据库提取时( 1)或填写表格(2):

$user = new User(..., $auth->email); (1)
$user = new User(..., $_POST['registration_mail']); (2)

最重要的是,一个名为is_registered的方法应该不会搞乱分配。它应该做的就是检查数据库中是否定义了当前的User实例类。

在你的第一种方法中,风险是弄乱一切。假设您有以下用户:

$user = new User('John', '[email protected]');

现在,让我们看看当你错误地将错误的电子邮件作为参数传递时会发生什么:

$result = $user->is_registered('[email protected]');
echo $user->name; // John
echo $user->email // [email protected]

在你的第二种方法中,你不应该允许is_registered接受任何论证,因为正如我之前解释过的那样,应该在创建时定义属性以避免致命错误。让我们带回我们在第一个例子中使用的相同用户:

$user = new User('John', '[email protected]');

现在,让我们看看当错误地传递错误的电子邮件作为参数时会发生什么([email protected]已注册,[email protected]不是):

$result = $user->is_registered('[email protected]'); // false

所以我的建议是,在创建实例时初始化属性,永远不要搞乱它。或者,您可以将静态函数实现到实用程序类中,对于给定的电子邮件,该实用程序类执行所需的检查。但是尽量让你的OOP设计尽可能严格。

© www.soinside.com 2019 - 2024. All rights reserved.