繁体   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