Использование класса PDO::FETCH для привязки полей таблицы к свойствам объекта


Используя PDO::FETCH_CLASS для заполнения полей класса значениями столбцов, возвращаемыми в результате выборки базы данных, я написал код, подобный этому.

<?php

class Recipe
{

    public $recipe_name;     // works without declaring variable here
    public $chef_name;       // works without declaring variable here
    public $num_ingredients; // works without declaring variable here

    public function __toString()
    {
        // Format output
        return sprintf(
        '<span class="recipe-name">%s</span>
            was made by <span class="chef-name">%s</span>,
            and it contains %s ingredients. <br />',
        $this->recipe_name,
        $this->chef_name,
        $this->num_ingredients
        );
    }
}

    ...
    ...

    if ($stmt) {
    if ($result = $stmt->execute()) {

        // Bind table fields to class properties..
        $recipe = $stmt->fetchAll(PDO::FETCH_CLASS, "Recipe");
    } else {

        echo "Query failed with message: " . $stmt->errorInfo()[2];
    }

}
...
...

// Show the results! We're done!
foreach ($recipe as $r) {
    echo $r;
}

Мне интересно, как это возможно, что это будет работать, даже если мы вообще не объявляем свойства класса? (см. выше)

Author: branquito, 2015-01-29

1 answers

В PHP, если вы попытаетесь назначить свойство объекту, когда свойство не было объявлено в определении класса, свойство будет объявлено с public видимостью и назначено во время выполнения. Например, если я создам следующий пустой класс:

class EmptyClass {}

И затем создайте экземпляр объекта EmptyClass:

$c = new EmptyClass();
var_dump($c);
// class EmptyClass#2 (0) {
// }

Присвоение свойства объекту $c неявно создаст это общедоступное свойство:

$c->implicitProperty = "I have a value";
var_dump($c);

// class EmptyClass#2 (1) {
//   public $implicitProperty =>
//   string(14) "I have a value"
// }

То же самое происходит, когда вы создайте экземпляр объекта из вызова PDOStatement::fetch().

Для случаев использования, когда такое поведение объекта PHP было бы полезным, см. Также:

 1
Author: Michael Berkowski, 2017-05-23 11:43:31