簡體   English   中英

PHP PDO:獲取樣式FETCH_CLASS和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_INTOfetchAll方法一起使用。

但是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM