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