इसलिए मैं PHP को ऑब्जेक्ट्स के बारे में जानकारी के लिए php.net के आसपास भटक रहा था , जब मैंने JSON को नए JsonSerializable इंटरफ़ेस में ठोकर खाई, तो PHP ऑब्जेक्ट्स को क्रमबद्ध करने के बारे में जानकारी के लिए । यह केवल PHP> = 5.4 है, और मैं 5.3.x वातावरण में चल रहा हूं।
इस प्रकार की कार्यक्षमता PHP <5.4 को कैसे प्राप्त की जाती है ?
मैंने अभी तक JSON के साथ ज्यादा काम नहीं किया है, लेकिन मैं एक एप्लिकेशन में एक एपीआई परत का समर्थन करने की कोशिश कर रहा हूं, और JSON में डेटा ऑब्जेक्ट ( जो अन्यथा दृश्य में भेजा जाएगा ) को डंप करना सही होगा।
अगर मैं सीधे ऑब्जेक्ट को क्रमबद्ध करने का प्रयास करता हूं, तो यह एक खाली JSON स्ट्रिंग देता है; ऐसा इसलिए है क्योंकि मुझे लगता json_encode()
है कि वस्तु के साथ क्या करना है पता नहीं है। क्या मुझे पुन: किसी ऑब्जेक्ट को सरणी में कम करना चाहिए, और फिर उसे एनकोड करना चाहिए ?
उदाहरण
$data = new Mf_Data();
$data->foo->bar['hello'] = 'world';
echo json_encode($data)
एक खाली वस्तु पैदा करता है:
{}
var_dump($data)
हालाँकि, उम्मीद के मुताबिक काम करता है:
object(Mf_Data)#1 (5) {
["_values":"Mf_Data":private]=>
array(0) {
}
["_children":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["foo"]=>
object(Mf_Data)#2 (5) {
["_values":"Mf_Data":private]=>
array(0) {
}
["_children":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["bar"]=>
object(Mf_Data)#3 (5) {
["_values":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["hello"]=>
string(5) "world"
}
}
["_children":"Mf_Data":private]=>
array(0) {
}
["_parent":"Mf_Data":private]=>
*RECURSION*
["_key":"Mf_Data":private]=>
string(3) "bar"
["_index":"Mf_Data":private]=>
int(0)
}
}
}
["_parent":"Mf_Data":private]=>
*RECURSION*
["_key":"Mf_Data":private]=>
string(3) "foo"
["_index":"Mf_Data":private]=>
int(0)
}
}
}
["_parent":"Mf_Data":private]=>
NULL
["_key":"Mf_Data":private]=>
NULL
["_index":"Mf_Data":private]=>
int(0)
}
परिशिष्ट
1)
तो यह वह toArray()
कार्य है जो मैंने Mf_Data
कक्षा के लिए तैयार किया है :
public function toArray()
{
$array = (array) $this;
array_walk_recursive($array, function (&$property) {
if ($property instanceof Mf_Data) {
$property = $property->toArray();
}
});
return $array;
}
हालाँकि, चूंकि Mf_Data
वस्तुओं में उनके माता-पिता ( युक्त ) वस्तु का भी संदर्भ होता है , इसलिए यह पुनरावृत्ति के साथ विफल हो जाता है। जब मैं _parent
संदर्भ हटाता हूं तो एक आकर्षण की तरह काम करता है ।
2)
बस का पालन करने के लिए, एक जटिल ट्री-नोड ऑब्जेक्ट को बदलने के लिए अंतिम कार्य जो मैंने किया था:
// class name - Mf_Data
// exlcuded properties - $_parent, $_index
public function toArray()
{
$array = get_object_vars($this);
unset($array['_parent'], $array['_index']);
array_walk_recursive($array, function (&$property) {
if (is_object($property) && method_exists($property, 'toArray')) {
$property = $property->toArray();
}
});
return $array;
}
3)
मैं एक कार्यान्वयन के एक बिट क्लीनर के साथ फिर से पालन कर रहा हूं। एक instanceof
चेक के लिए इंटरफेस का उपयोग करने से अधिक क्लीनर लगता है method_exists()
( हालांकि method_exists()
क्रॉस-कट इनहेरिटेंस / कार्यान्वयन )।
उपयोग करना unset()
थोड़ा गड़बड़ भी लग रहा था, और ऐसा लगता है कि तर्क को दूसरी विधि में फिर से बनाया जाना चाहिए। हालांकि, यह कार्यान्वयन संपत्ति सरणी ( कारण ) की प्रतिलिपि बनाता है , इसलिए कुछ पर विचार करें।array_diff_key
interface ToMapInterface
{
function toMap();
function getToMapProperties();
}
class Node implements ToMapInterface
{
private $index;
private $parent;
private $values = array();
public function toMap()
{
$array = $this->getToMapProperties();
array_walk_recursive($array, function (&$value) {
if ($value instanceof ToMapInterface) {
$value = $value->toMap();
}
});
return $array;
}
public function getToMapProperties()
{
return array_diff_key(get_object_vars($this), array_flip(array(
'index', 'parent'
)));
}
}
JsonSerializable