php cast class to class
Преобразование / приведение объекта stdClass в другой класс
Я использую стороннюю систему хранения, которая возвращает мне только объекты stdClass независимо от того, что я ввожу по какой-то неясной причине. Поэтому мне интересно узнать, есть ли способ привести/преобразовать объект stdClass в полноценный объект данного типа.
например, что-то вроде:
Я просто бросаю stdClass в массив и передаю его конструктору BusinessClass, но, возможно, есть способ восстановить начальный класс, который я не осознаю.
Примечание: меня не интересует тип ответов «изменить систему хранения», так как это не представляет интереса. Пожалуйста, рассматривайте это скорее как академический вопрос о языковых возможностях.
7 ответов
посмотреть руководство по типу жонглирования о возможном приведении.
вы придется написать маппер это делает литье из stdClass в другой конкретный класс. Это будет нетрудно сделать.
или, если вы находитесь в хакерском настроении, вы можете адаптировать следующий код:
который псевдокастирует массив объекту определенного класса. Это работает, сначала сериализуя массив, а затем изменяя сериализованные данные так, чтобы он представлял определенный класс. В результате необходимо выполнить десериализацию на экземпляр этого класса. Но как я уже сказал, это банально, так что ожидайте побочных эффектов.
для объекта к объекту, код будет
вы можете использовать вышеуказанную функцию для кастинга не похожих объектов класса (PHP >= 5.3)
для перемещения всех существующих свойств a stdClass новый объект с указанным именем класса:
Это ограничено из-за new оператор, поскольку неизвестно, какие параметры ему понадобятся. Для вашего случая, вероятно, подходит.
У меня очень похожая проблема. Упрощенное решение отражения работало просто отлично для меня:
Преобразование/литье объекта stdClass в другой класс
Я использую стороннюю систему хранения, которая возвращает мне только объекты stdClass, независимо от того, что я питаю по какой-то неясной причине. Поэтому мне любопытно узнать, есть ли способ сбрасывать/преобразовывать объект stdClass в полноценный объект определенного типа.
Например, что-то вроде строк:
Я просто бросаю stdClass в массив и передаю его конструктору BusinessClass, но, возможно, есть способ восстановить исходный класс, о котором я не знаю.
Примечание. Меня не интересует тип ответов «Изменить систему хранения», поскольку это не является интересом. Пожалуйста, рассмотрите более академический вопрос о возможностях языка.
ОТВЕТЫ
Ответ 1
Обратитесь к руководству о типе жонглирования о возможных отбросах.
Вам нужно написать Mapper, который выполняет кастинг из stdClass в другой конкретный класс. Не должно быть слишком сложно сделать.
Или, если вы находитесь в хакерском настроении, вы можете адаптировать следующий код:
который псевдокастирует массив к объекту определенного класса. Это работает, сначала сериализуя массив, а затем меняя сериализованные данные, чтобы он представлял определенный класс. Следовательно, результат будет неэтериализован для экземпляра этого класса. Но, как я уже сказал, он взламывает, поэтому ожидайте побочных эффектов.
Для объекта к объекту код будет
Ответ 2
Вы можете использовать вышеприведенную функцию для отливки не похожих объектов класса (PHP >= 5.3)
Ответ 3
Чтобы переместить все существующие свойства stdClass в новый объект указанного имени класса:
Ответ 4
У меня очень похожая проблема. Упрощенное решение отражения отлично справилось со мной:
Ответ 5
Надеюсь, что кто-нибудь найдет этот полезный
Ответ 6
Измененная функция для глубокого литья (с использованием рекурсии)
Ответ 7
Кстати: преобразование очень важно, если вы сериализованы, в основном потому, что десериализация разбивает тип объектов и превращается в стандартный класс, включая объекты DateTime.
Я обновил пример @Jadrovski, теперь он позволяет объекты и массивы.
код: (рекурсивно). Тем не менее, я не знаю, является ли это рекурсивным с массивами. Может быть, в нем отсутствует лишний is_array
Ответ 8
рассмотрите возможность добавления нового метода в BusinessClass:
Ответ 9
Теперь возможно следующее благодаря последней версии PHP 7.
В конце концов, мы перебираем все элементы, содержащиеся в переданном объекте, и затем динамически присваиваем свойство объекта.
Чтобы сделать это событие согласования более общим, вы можете написать интерфейс или Trait, которые вы будете реализовывать в любом классе, где вы хотите иметь возможность приводить stdClass.
Ответ 10
И еще один подход, использующий шаблон декоратора и PHP Magic Magic Getter & Сеттеры:
PHP Cast to my class
why this is not possible:
but this is possible
8 Answers 8
As I know, in PHP you can only cast to some types:
Instead you could use instanceof to check of specific type:
EDIT
As mentioned by Szabolcs Páll in his answer, it is also possible to declare a return type or parameter type, but in that cases an exception (TypeError) will be throwen, if the type does not match.
If you just want to ensure a variable is instance of YourClass and let exception handling to the typesystem you can use the following function:
Note: this will not actually do any casting, rather it throws exceptions in case of class mismatch and lets intellisense treat it as an instance of the target class.
You can use PHPDoc
For people that do want to be able to cast to a class type. I’ve found a gist by @borzilleri that uses serialize and unserialize to achieve this: https://gist.github.com/borzilleri/960035.
TL;DR:
Objects and primitive types are different. Since it’s called as primitive types, they are really simple, maybe only 1 byte, 2 bytes, or 4 bytes, and at most 8 bytes.
When we are talking about object, this object can have different attributes with the others. Then the question from PHP will be is, «is this object really from my Class?» «How to convert this object to my Class?». Thus, you can’t parse right away the object using
Then how to cast it? Dunno, but usually the approach is like this:
In addition to the answer on why this is not possible, I would suggest that you write a builder function that creates an object, based on your input. so it would look something like
There are hacks out there that suggest doing this with serialization. I would suggest to steer away from them, as they are hackish and as far as i’m concerned, not very clear.
Php cast class to class
В этом разделе перечисляются стандартные предопределённые классы. Разнообразные модули определяют другие классы, которые описаны в соответствующей справочной информации.
Стандартные определённые классы
Эти классы определены вместе со стандартным набором функций, идущим со сборкой PHP.
Специальные классы
Следующие идентификаторы не могут использоваться в качестве имени класса, так как у них есть специальное назначение.
User Contributed Notes 7 notes
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.
However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I’d advise you to implement ::__set_state().
/* Output:
(object) array (‘prop1’ => true, ‘prop2’ => (object) array (‘test’ => ‘abc’, ‘other’ => 6.2, ‘arr’ => array (0 => 1, 1 => 2, 2 => 3)), ‘assocArray’ => array (‘apple’ => ‘good’, ‘orange’ => ‘great’))
*/
?>
Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn’t formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
Php cast class to class
Is it possible to cast a parent class to its child in PHP? If not, what is the most efficient alternative to effecting this?
For example, the following results in an error:
For the specific functionality in your example, I would prefer putting the logic of the code into protected constructors and calling them from the factory method:
You could simplify this code down even further using the static keyword:
It may be that using protected constructors isn’t an option, e.g. because you already have a public constructor with required arguments or a similar situation. In this case you would have to resort to what is explained in the other answers, creating a temporary Foo and copying property values over to a new Bar object:
Cast the current object ($this) to a descendent class, Casting to change the object’s type is not possible in PHP (without using a nasty of a child class is also an instance of a parent class, the reverse is not true. The true problem here is that a parent class should never rely on the existence of a child class method. This is a guiding principle of OOD, and indicates that there is a serious flaw in your design. If your parent class is dependent on a specific child, then it cannot be used by any other child classes that might extend it as well. The parent
I don’t think there’s anything built-in that does this. You’ll can write a function in the child class that takes an instance of the parent class and returns a child with the same contents.
I was able to implement this using the following strategy: