Php 通过类的私有成员变量读取bindParam

Php 通过类的私有成员变量读取bindParam,php,pdo,private-members,bindparam,Php,Pdo,Private Members,Bindparam,我创建了一个名为User的类,它只包含私有成员变量和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

我创建了一个名为
User
的类,它只包含私有成员变量和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
,同时显示运行时严格警告时,插入代码生成警告
STRICT standards,只有变量应该通过引用传递给
bindParam
行。询问谷歌后,我发现显然我必须分两步来完成这项工作:

$id = $user->get_id()
$stmt->bindParam(':id', $id);
将它们转换为新格式后,一切都可以正常工作,没有任何警告

问题是,我原来的
用户类
更大,有20多个私有成员变量,我还有其他类似的类。所以我想迭代变量并将它们保存在一个数组中,然后
bindParam
将它们保存为数组。但是我面临的问题是,
foreach
只循环公共变量,而不循环私有变量。。。所以我现在的问题是:

  • 是否可以以某种方式将
    bindParam
    与循环组合
  • 如果是,如何循环私有成员变量并保存它们

  • 为了方便起见,我在任何地方都使用相同的命名格式。i、 e.数据库中使用
    firstname
    的列将在
    用户类中使用
    get\u firstname()
    set\u firstname($firstname)
    作为getter/setter的对应项
    m\u firstname
    ,我认为您应该使用
    public bool PDOStatement::bindValue(混合$parameter,混合$value[,int$data\u type=PDO::PARAM\u STR])

    而不是bindParam(),并保留getter:)


    从注释转移到回答

    我认为你应该使用
    public bool语句::bindValue(mixed$parameter,mixed$value[,int$data\u type=PDO::PARAM\u STR])
    而不是bindParam,并保留你的getter…只需使用
    bindValue
    该方法仅适用于插入,不适用于更新。这怎么可能?在指定数据类型时尝试使用it事件不会导致数据库中的任何更新。我正在使用sqlsrv pdo。有什么想法吗?