bindParam 读写一个class的私有成员变量

bindParam literate through private member variable of a class

我创建了一个名为 User 的 class,只有私有成员变量和 getter/setter 函数

class User {
   private $m_id;
   private $m_firstname;
   private $m_lastname;

   public function get_firstname() { return $this->m_firstnmae; }
   public function set_firstname($firstname) { $this->m_firstname = $firstname; }
   ...
}

所以print_r($user)会给我这样的东西:

User Object
(
   [m_id:User:private] => 2725
   [m_firstname:User:private] => Alan
   [m_lastname:User:private] => Turing
)

现在我正在使用 PDO 将对象插入数据库(我将跳过连接部分,因为它正在工作而不是问题的一部分)。这是我插入数据的函数:

function insert($user) 
{
    $insert_query = "insert into table (id,firstname,lastname) values (:id, :firstname, :lastname)";
    try
    {
        $stmt = $this->m_pdo->prepare($insert_query);
        $stmt->bindParam(':id', $user->get_id());
        $stmt->bindParam(':firstname', $user->get_firstname());
        $stmt->bindParam(':lastname', $user->get_lastname());

        $stmt->execute();
        return true;
    }
    catch (PDOException $ex)
    {
        echo $this->m_error_message = $ex->getMessage();
        return false;
    }
}

同样有效。但是,当我将 php error_reporting 更改为 E_ALL | E_STRICT 时,它也显示运行时严格警告,插入代码为 bindParam 行生成警告 strict standards only variables should be passed by reference .问了google后,我发现显然我必须分两步来做:

$id = $user->get_id()
$stmt->bindParam(':id', $id);

将它们转换为新格式后,一切正常,没有任何警告。

问题是,我原来的 User-class 比 20 个私有成员变量要大得多,而且我还有其他类似的 class。所以我在考虑遍历变量并将它们保存在一个数组中,然后 bindParam 它们作为数组。但是后来我遇到了 foreach 只循环遍历 public 变量而不是私有变量的问题......所以我现在的问题是:

  1. 是否可以将 bindParam 与循环结合起来?
  2. 如果是,我如何遍历私有成员变量并保存它们?

为了方便起见,我到处都使用相同的命名格式。即数据库中具有 firstname 的列将在 User-class 中具有对应的 m_firstnameget_firstname()set_firstname($firstname) 作为 getter/setter

我认为你应该使用
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
而不是 bindParam() 并保留你的 getters :)

已从评论移至回答