2016-10-26 3 views
1

Похоже, что при использовании PDO :: FETCH_CLASS не существует способа сделать PDO для создания нового объекта с помощью конструктора/сеттера.Есть ли причина, почему PDO не имеет возможности создавать объекты через конструктор с FETCH_CLASS?

В настоящее время с FETCH_CLASS переменные-члены заполняются с использованием отражения, я думаю. Они, конечно, не передаются через конструктора. Это бесполезно, потому что оно обходит любые проверки, которые могут возникнуть у вашего конструктора, чтобы обеспечить согласованность объекта (задача не может иметь статус $ status = завершена, а не имеет установленный набор $ finalDate).

Существуют различные варианты, некоторые из которых относятся к особенностям с очень краем (например, PDO :: FETCH_NAMED). Это приводит меня к предположению, что создание конструктора не реализовано, потому что есть некоторая причина, почему это не очень хорошая идея.

Примечание: Я не ищу третий аргумент fetchAll (ctor_args), который не пропускает значения строки, а скорее предоставленные.

Обновление: Кажется, что я не был ясен в описании того, что я прошу. Представьте себе, у меня есть конструктор, как это:

public function __construct($id, $number) { 
    if ($id == $number) { 
     throw new InvalidArgumentException("Number and ID can't be same"); 
    } 
} 

и сделать

SELECT id, number FROM table 

С любыми настройками, даже $st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo'); не будет сгенерировано исключение и счастливо создать объект в неопределенном состоянии. Поскольку значения не задаются с помощью конструктора. На самом деле ближе приближение того, что я назвал бы ожидаемое поведение было бы то, что упоминается в https://stackoverflow.com/a/33027392/112000

Update: Я создал запрос функции для этого https://bugs.php.net/bug.php?id=73397 только в случае, если вы заинтересованы в нем, как хорошо.

+0

Я думаю, что это может помочь вам: HTTP: // StackOverflow.com/questions/8898794/using-pdofetch-class-with-magic-methods – Roman

ответ

0

Я думаю, что по историческим причинам.

Сначала было mysql_fetch_object - только для дополнения выборки триады - список, хеш, объект - для создания экземпляра класса сразу после строки базы данных.

Затем введите PDO с множеством приятных функций, но все же под одной и той же парадигмой - присвоить свойства вновь созданной переменной после столбцов в базе данных.

Поэтому я думаю, что это просто потому, что никто не думал, что PDO можно использовать таким образом.

Так что я думаю, что ближайший результат вы можете получить using a closure to create an instance:

$job = $pdo 
    ->query('SELECT id, number FROM users') 
    ->fetchAll(PDO::FETCH_FUNC, function($id,$number) {return new Job($id,$number);}); 
+0

Пожалуйста, см. Обновленный ответ. Надеюсь, теперь я понятен. –

+0

Так вот что я написал точно. Вам просто нужно использовать свойства вместо переменных. большая проблема для вас? –

+0

См. обновленный ответ –

0

Это можно вызвать конструктор перед заполнением ваших объектов. Из manual:

, если вы хотите, чтобы принести свой результат в классе (с помощью PDO :: FETCH_CLASS) и хотите, конструктор будет выполняться до того PDO assings свойства объекта, вы должны использовать PDO :: FETCH_PROPS_LATE константа:

<?php 
$stmt = $pdo->prepare("your query"); 

$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "className", $constructorArguments); 

# pass parameters, if required by the query 
$stmt->execute($parameters); 

foreach ($stmt as $row) 
{ 
    // do something with (each of) your object 
} 
?> 
+0

См. обновленный ответ. Надеюсь, теперь я ясно. –

+0

Я имел в виду ** обновленный вопрос **, извините :( –

Смежные вопросы