【问题标题】:PHP PDO: Do the fetch styles FETCH_CLASS and FETCH_INTO fetch into private object properties?PHP PDO:提取样式 FETCH_CLASS 和 FETCH_INTO 是否提取到私有对象属性中?
【发布时间】:2011-11-09 02:58:34
【问题描述】:

很短的问题,这里是一个例子:

$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);

(从头顶写,可能包含语法错误)

这两个是否直接获取到所述对象的 private 属性? 我读到它也规避了__construct 功能,那么它也会规避私有状态吗?

【问题讨论】:

    标签: php database pdo


    【解决方案1】:

    非常简短的回答:是的。

    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 方法一起使用。

    【讨论】:

    • 啊,好吧...由于 fetchAll 想要创建多个对象,这将永远无法工作。我明白了!
    • 创建类没有问题,它是 FETCH_INTO 不起作用,因为您只能发送单个对象作为参数。
    • @Wesleay 这就是我所指的。我只给它一个实例,所以它不起作用。
    • PDO::FETCH_INTO 会给你例外cannot access protected property。但是,PDO::FETCH_CLASS 工作正常。
    • -1 这是不正确的。 FETCH_INTO 无法获取私有属性。请测试你的答案。
    【解决方案2】:

    但是 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
    */
    

    但是,如果您将属性设置为 protected - 它可以正常工作

    【讨论】:

    • Private 属性只属于类,不能被子类继承。
    【解决方案3】:

    您无法访问超类的私有属性的原因是这些属性超出了范围。子类不具有其父类的私有属性,包括变量和函数。

    编辑:感谢您澄清您的问题,但这确实让我的回答在这里看起来有点荒谬。 :p

    【讨论】:

      【解决方案4】:

      你可以试试:

      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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2011-02-18
        相关资源
        最近更新 更多