![](/img/trans.png)
[英]What is difference between PDO::FETCH_CLASS and PDO::FETCH_INTO
[英]PHP PDO: Do the fetch styles FETCH_CLASS and FETCH_INTO fetch into private object properties?
很簡短的問題,這是一個例子:
$prepared = $this->pdo->prepare("SELECT * FROM Users WHERE ID = :ID");
$statement = $prepared->execute(array(":ID" => $User_ID))
$result = $statement->fetchAll(PDO::FETCH_CLASS, "User");
//OR
$User = new User();
$result = $statement->fetch(PDO::FETCH_INTO, $User);
(從頭頂寫,可能包含語法錯誤)
那兩個直接獲取所述對象的私有屬性嗎? 我讀它也繞過了__construct
函數,它也會繞過私有狀態嗎?
答案非常簡短:是的。
class Foo
{
private $id;
public function echoID()
{
echo $this->id;
}
}
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo");
$result[0]->echoID(); // your ID
在旁邊:
這將導致語法錯誤$statement->fetchAll(PDO::FETCH_INTO, $User);
。 您不能將FETCH_INTO
與fetchAll
方法一起使用。
但是PDO :: FETCH_CLASS的事件對於子類的私有屬性存在問題。 例如
class Animal
{
private $color;
public function getColor()
{
return $this->color;
}
}
class Cat extends Animal
{
}
$statement->setFetchMode(PDO::FETCH_CLASS, "Cat" );
$someCat = $statement->fetch();
echo $someCat->getColor(); //empty
print_r( $someCat );
/*
now have strange output like:
[color:Animal:private] =>
[color] => grey
*/
但是,如果您將屬性設置為受保護 - 它可以正常工作
您無法訪問超類上的私有屬性的原因是因為這些屬性超出了范圍。 子類不承擔其父類的私有屬性,包括變量和函數。
編輯:感謝您澄清您的問題,但這確實讓我的答案在這里看起來有點荒謬。 :p
你可以嘗試:
class Foo {
private $id;
public function __set($prop, $val) {
$this->$prop = $val;
}
public function __get($prop) {
return $this->$prop;
}
}
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo");
$result[0]->id();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.