С помощью 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;
}
Мне интересно, как это возможно, что это будет работать, даже если мы не будем
объявить свойства класса вообще? (см. выше)
В 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 было бы полезным, смотрите также:
Других решений пока нет …