Проблемы с получением нового экземпляра объекта с помощью PDO - PullRequest
1 голос
/ 28 ноября 2010

Я добавляю раздел очистки на веб-сайт и сталкиваюсь с досадной небольшой проблемой с PDO. Я создал класс ClearanceItem для хранения информации об отдельном элементе. Все свойства элемента защищены, и я создал для них аксессоры и мутаторы. Я создал этот класс по двум причинам:

  1. Я могу проверить свойства по мере их установки. Это важно для меня, так как база данных заполняется по расписанию из файлов Excel, которые поддерживает клиент. Используя мутаторы, я могу убедиться, что информация в файлах Excel находится в определенных пределах.
  2. Поскольку сайт доступен на английском и французском языках, авторы могут корректно форматировать данные (например, цены) в зависимости от языка представления.

Я хочу иметь возможность циклически повторять набор результатов PDO, автоматически получая новый экземпляр моего класса ClearanceItem для каждой строки. Это легко сделать, установив режим выборки или используя PDOStatement :: fetchObject (). У меня проблемы, хотя с тем, что свойства защищены. Кажется, что когда PDO создает новый экземпляр класса, он использует что-то под названием Reflection Injection для установки свойств. Это означает, что защищенные свойства устанавливаются непосредственно PDO, минуя созданные мной мутаторы. Из-за этого свойства, которые должны быть числами (и которые установлены как таковые мутаторами), устанавливаются как строки. Хуже всего то, что я использую MySQL GROUP_CONCAT для возврата информации о нескольких хранилищах и инвентаризации в виде одной строки, которую затем следует разбить на массив. Поскольку PDO устанавливает это свойство напрямую, оно заканчивается строкой.

Я легко могу преодолеть эту проблему, имея фабричный метод для создания нового экземпляра ClearanceItem из массива, возвращаемого из строки набора результатов. Это кажется ненужным дополнительным шагом. Кто-нибудь знает, возможно ли, чтобы PDO возвращал экземпляр класса для каждой строки в наборе записей, при этом соблюдая его видимость свойств, используя мутаторы для установки свойств?

1 Ответ

1 голос
/ 28 ноября 2010

Я только что проверил, он будет вызывать функцию __set () для каждого набора свойств.

class test {
  function __construct() {
    print "Constructor\n";
    var_dump(func_get_args());
  }
  function __get($x) {
    print "In get\n";
    var_dump($x);
  }
  function __set($x, $y) {
    print "In set\n";
    var_dump($x);
  }
}

$m = getMasterPDODB();
$stm = $m->prepare("SELECT * FROM users");
if( $stm && $stm->execute() ) {
  while( $cls = $stm->fetchObject("test") ) {
    var_dump($cls);
  }
}

дал мне

Constructor

array
  empty

In set

string 'id' (length=2)

In set

string 'active' (length=6)

In set

string 'email' (length=5)

In set

string 'passphrase' (length=10)

In set

string 'details' (length=7)

object(test)[5]

Constructor

array
  empty

In set

string 'id' (length=2)

In set

string 'active' (length=6)

In set

string 'email' (length=5)

In set

string 'passphrase' (length=10)

In set

string 'details' (length=7)

object(test)[6]

Constructor

array
  empty

In set

string 'id' (length=2)

In set

string 'active' (length=6)

In set

string 'email' (length=5)

In set

string 'passphrase' (length=10)

In set

string 'details' (length=7)

object(test)[5]

Constructor

array
  empty

In set

string 'id' (length=2)

In set

string 'active' (length=6)

In set

string 'email' (length=5)

In set

string 'passphrase' (length=10)

In set

string 'details' (length=7)

object(test)[6]

Constructor

array
  empty

In set

string 'id' (length=2)

In set

string 'active' (length=6)

In set

string 'email' (length=5)

In set

string 'passphrase' (length=10)

In set

string 'details' (length=7)

object(test)[5]

И поскольку мои данные - это объект json, я могу оттуда разобрать их в необходимые поля. Вы можете просто вызвать мутаторов, которых вы создали оттуда. Кажется, это лучший способ без сумасшедшей магии ниндзя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...