我创建了一个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 only variables should be passed by reference
为这些bindParam
行生成警告。在问了谷歌之后,我发现显然我必须分两步执行此操作:
$id = $user->get_id()
$stmt->bindParam(':id', $id);
将它们转换为新格式后,一切正常,没有任何警告。
问题是,我的原始User-class
文件更大,有 20 多个私有成员变量,而且我还有其他类似的类。所以我在考虑遍历变量并将它们保存在一个数组中,然后将它们保存bindParam
为数组。但是后来我面临的问题是foreach
只遍历公共变量而不是私有变量......所以我现在的问题是:
- 是否可以以
bindParam
某种方式与循环结合? - 如果是,我如何遍历私有成员变量并保存它们?
为方便起见,我在任何地方都使用相同的命名格式。即数据库中的列 withfirstname
将m_firstname
在User-class
withget_firstname()
和set_firstname($firstname)
作为 getter/setter中具有对应项