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

С помощью 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;
}

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

2

Решение

В 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

Другие решения

Других решений пока нет …