Получение свойств объекта, полученного из БД с помощью PDO fetchAll (PDO :: FETCH_OBJ) - PullRequest
0 голосов
/ 06 января 2019

У меня есть массив объектов, извлеченных из БД с помощью PDO fetchALL (PDO :: FETCH_OBJ). Когда я var_dump первый элемент этого массива: var_dump($this->stockList[0]); Я получаю:

object(stdClass)[5]
public 'userId' => string '3' (length=1)
public 'symbol' => string 'ibm' (length=3)
public 'date' => string '2019-01-03' (length=10)
public 'quantity' => string '5' (length=1)
public 'bought' => string '1' (length=1)
public 'observed' => string '0' (length=1)
public 'dividendRate' => string '6.28' (length=4)
public 'exDividendDate' => string '2018-11-08' (length=10)
public 'forwardDividend' => string '31.400000000000002' (length=18)

Я хотел бы использовать отражение для этого объекта, чтобы получить все его свойства:

$r = new ReflectionClass($this->stockList[0]);
$objProperties = $r->getProperties();

Я получаю правильный класс: var_dump($r); производит: object(ReflectionClass)[16] public 'name' => string 'stdClass' (length=8)

но я не могу получить свойства этого объекта: var_dump($objProperties); дает пустой массив: array (size=0) empty Итак, вопрос в том, как мне получить список свойств этого объекта? Мой полный код:

$sql = "query";
$this->stockList = $this->con->query($sql)->fetchAll(PDO::FETCH_OBJ);

var_dump($this->stockList[0]);
$r = new ReflectionClass($this->stockList[0]);
$objProperties = $r->getProperties();
var_dump($r);
var_dump($objProperties);

1 Ответ

0 голосов
/ 06 января 2019

Отражение с использованием StdClass не будет работать. Вызов ReflectionClass(), параметр один, использует ::class экземпляра для определения его свойств. Поскольку StdClass не имеет свойств по умолчанию и задается динамически, Reflection не может найти никаких свойств, поскольку по умолчанию они не существуют.

Вы можете увидеть выше в демо . Тем не менее, для еще большей простоты это будет работать нормально:

var_dump(array_keys((array) new Foo('bar'))); # Based on above demo

Однако не паникуйте. Вам не нужно использовать отражение для этого: \PDO::FETCH_ASSOC даст вам многомерный массив. Вы можете использовать array_keys(), чтобы получить параметры. Затем позже, если вы предпочитаете использовать результат в качестве объекта, приведите массив в качестве объекта.

# Fetch Query
$this->stockList = $this->con->query($sql)->fetchAll(PDO::FETCH_ASSOC);

# Get properties which will be, in this case, ['id', 'symbol', 'date', 'quantity', 'bought', 'observed', 'dividendRate', 'exDividentDate', 'forwardDivident']
$properties      = array_keys($this->stockList[0]);

# Revert all back to StdClass instances by casting the array to object
foreach($this->stockList as &$stockItem) {
    $stockItem = (object) $stockItem;
}

Альтернативно, как предложено в комментариях @ Quasimodosclone . Вы можете использовать get_object_vars(), который вернет массив, эквивалентный объекту. Затем, как и раньше, используйте array_keys() для получения свойств.

$this->stockList = $this->con->query($sql)->fetchAll(PDO::FETCH_OBJ);
$properties      = array_keys(get_object_vars($this->stockList[0]));

После проверки из любопытства объект может быть приведен к массиву для достижения большей простоты.

$this->stockList = $this->con->query($sql)->fetchAll(PDO::FETCH_OBJ);
$properties      = array_keys( (array) $this->stockList[0] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...