Last active
November 15, 2018 02:11
-
-
Save ryanbrainard/9422285ed28af0e187aa242c0c025ccf to your computer and use it in GitHub Desktop.
PHP Class <-> JSON Serialization/Deserialization with Static & Dynamic Comparison
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Car | |
{ | |
private $brand; | |
private $model; | |
private $year; | |
public function __construct($brand, $model, $year) | |
{ | |
$this->brand = $brand; | |
$this->model = $model; | |
$this->year = $year; | |
} | |
public function toJson() | |
{ | |
$arr = array( | |
'brand' => $this->brand, | |
'model' => $this->model, | |
'year' => $this->year, | |
); | |
return json_encode($arr); | |
} | |
public static function fromJson($json) | |
{ | |
$arr = json_decode($json, true); | |
return new self( | |
$arr['brand'], | |
$arr['model'], | |
$arr['year'] | |
); | |
} | |
} | |
// original object | |
echo 'car1: '; | |
$car1 = new Car('Hyundai', 'Tucson', 2010); | |
var_dump($car1); | |
// serialize | |
echo 'car1class: '; | |
$car1class = get_class($car1); // need the class name for the dynamic case below. this would need to be bundled with the JSON to know what kind of class to recreate. | |
var_dump($car1class); | |
echo 'car1json: '; | |
$car1Json = $car1->toJson(); | |
var_dump($car1Json); | |
// static recreation with direct invocation. can only do this if you know the class name in code. | |
echo 'car2: '; | |
$car2 = Car::fromJson($car1Json); | |
var_dump($car2); | |
// dynamic recreation with reflection. can do this when you only know the class name at runtime as a string. | |
echo 'car3: '; | |
$car3 = (new ReflectionMethod($car1class, 'fromJson'))->invoke(null, $car1Json); | |
var_dump($car3); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
car1: object(Car)#1 (3) { | |
["brand":"Car":private]=> | |
string(7) "Hyundai" | |
["model":"Car":private]=> | |
string(6) "Tucson" | |
["year":"Car":private]=> | |
int(2010) | |
} | |
car1class: string(3) "Car" | |
car1json: string(48) "{"brand":"Hyundai","model":"Tucson","year":2010}" | |
car2: object(Car)#2 (3) { | |
["brand":"Car":private]=> | |
string(7) "Hyundai" | |
["model":"Car":private]=> | |
string(6) "Tucson" | |
["year":"Car":private]=> | |
int(2010) | |
} | |
car3: object(Car)#4 (3) { | |
["brand":"Car":private]=> | |
string(7) "Hyundai" | |
["model":"Car":private]=> | |
string(6) "Tucson" | |
["year":"Car":private]=> | |
int(2010) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment