Подскажите кейсы, когда стоит использовать stdClass. Ответ типа "преобразовать массив в объект" не годится, ибо я не вижу преимущества. Поля динамические, а значит невозможно быть уверенным, что это тот объект, который нам нужен. Зачем это все нужно?
а причем тут "без пыха", если вы говорите об "удобствах сокращения". Я вам показал пример, когда это вредно, ибо в смарти это выглядит более лучше (короче).
DevMan: >а stdclass и доступ к свойствам? К каким? Они же создаются динамически, и я не знаю что в них есть, будет или было.
> и окуда его брать? где он объявлен?
Объявлять и брать :)
DevMan: Хороший пример это модельки какой нибудь ORM. Объявил и взял. Доступны все публичные свойства объекта. Глядя на класс, можно понять что за свойства и методы у него. А у std? А может он пришел урезанным (битые данные)?
Victor Golovko: > Они же создаются динамически, и я не знаю что в них есть, будет или было.
в массиве они тоже создаются динамически, например, при json_decode, но это же не трагедия?
stdClass - пустой класс, у которого изначально нет ни методов (вообще), ни свойств (можно создать динамически).
если у вас уже есть класс, то зачем мы сейчас вообще трем за std?
DevMan: >то зачем мы сейчас вообще трем за std?
Зачем он тогда нужен, я же и спрашиваю. Если у него нет вообще никаких преимуществ и данные в нем легко можно модифицировать, затереть и т.д.
Каждую передачу std объекта в метод нужно валидировать на существование свойства. Например при изменение разработчиком класса можно зайти в него и посмотреть что изменилось и добавить какие то изменения в код. А как проследить изменения в stdClass? Нужно просмотреть весь проект, чтобы определить места, где он мог измениться!
> в массиве они тоже создаются динамически, например, при json_decode, но это же не трагедия?
Трагедия! Для этого и существуют классы, чтобы данные были задокументированы. json_decode чаще всего данные извне, которые валидируются в соответствии с типом ожидаемых данных
Victor Golovko: в любом классе публичные свойства можно модифицировать, почему этот должен быть исключением?
и никаких преимуществ у него не должно быть бай дизайн. кроме того, что он описан в ядре и нет необходимости описывать класс самому, когда нужна пустышка/заглушка.
DevMan: > в любом классе публичные свойства можно модифицировать, почему этот должен быть исключением?
В любом классе свойства можно/нужно сделать приватными а в стд... По моему мнению ООП для того, чтобы классы были предсказуемы и на основании их описания можно было понять их зону ответсвенности, понять какой тип/данные возвращает, скрыть разрешить изменение этих данных.
Стд еще хуже чем массив себя поведет ибо объекты передаются по ссылке и затереть данные случайно очень просто (тоже самое, что и по ссылке массивы обрабатывать)
Victor Golovko: ваша ошибка в том, что вы воспринимаете stdClass как полноценный класс, коим он не является.
воспринимайте его как структуру данных, которую либо можно применять, либо нельзя, в зависимости от задачи и личных предпочтений.
PS до реализации array dereferencing stdClass дополнительно давал плюшки в синтаксисе, сейчас этого уже нет.
stdClass - это объект, а объект передается по ссылке в функции/методы, в отличии от массива.
По сути это тот же массив, только в виде класса. Что Вам удобнее, то и берите.
Если же Вам возвращается stdClass от каких либо библиотек, то просто вытащите из него данные в массив: $arr = get_object_vars($std);