2011-09-02 1 views
7

かなり短い質問は、ここでの例です:PHP PDO:フェッチスタイルFETCH_CLASSおよびFETCH_INTOはプライベートオブジェクトプロパティにフェッチしますか?

$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の機能を迂回して読むので、私的な状態も迂回するでしょうか?

答えて

7

非常に短い答え:はいそうです。別に

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);構文エラーが発生します。 fetchAllメソッドではFETCH_INTOを使用できません。

+1

ああ、大丈夫...これが機能することはありません。わかった! – sinni800

+0

クラスを作成する際には問題ありませんが、FETCH_INTOは動作しません。これは、単一のオブジェクトをパラメータとしてのみ送信できるためです。 –

+0

@Wesleayそれは私が参照していたものです。私はそれを単一インスタンスにするだけで動作しません。 – sinni800

1

しかし、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 
*/ 

しかし、あなたは保護にプロパティを設定している場合 - これらのプロパティは、範囲外であるので、それはあなたがスーパークラスでプライベートプロパティにアクセスすることはできません

+1

*プライベート*プロパティはクラスにのみ属し、サブクラスに継承することはできません。 – crodas

0

理由正常に動作です。サブクラスは、変数や関数を含む親クラスのプライベート属性を受け付けません。

編集:あなたの質問を明確にしてくれてありがとうございますが、私の答えはここでちょっとばかげて見えます。 :P

0

あなたが試みることができる:fetchAllのは、複数のオブジェクトを作成したいので

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(); 
関連する問題