PHP实现的json类实例
本文实例讲述了PHP实现的json类。分享给大家供大家参考。具体如下:
这里注意json_encode只有(PHP5>=5.2.0,PECLjson>=1.2.0)才有
<?php /*vim:setexpandtabtabstop=4shiftwidth=4softtabstop=4:*/ /** *ConvertstoandfromJSONformat. * *JSON(JavaScriptObjectNotation)isalightweightdata-interchange *format.Itiseasyforhumanstoreadandwrite.Itiseasyformachines *toparseandgenerate.ItisbasedonasubsetoftheJavaScript *ProgrammingLanguage,StandardECMA-2623rdEdition-December1999. *ThisfeaturecanalsobefoundinPython.JSONisatextformatthatis *completelylanguageindependentbutusesconventionsthatarefamiliar *toprogrammersoftheC-familyoflanguages,includingC,C++,C#,Java, *JavaScript,Perl,TCL,andmanyothers.ThesepropertiesmakeJSONan *idealdata-interchangelanguage. * *ThispackageprovidesasimpleencoderanddecoderforJSONnotation.It *isintendedforusewithclient-sideJavascriptapplicationsthatmake *useofHTTPRequesttoperformservercommunicationfunctions-datacan *beencodedintoJSONnotationforuseinaclient-sidejavascript,or *decodedfromincomingJavascriptrequests.JSONformatisnativeto *Javascript,andcanbedirectlyeval()'edwithnofurtherparsing *overhead * *AllstringsshouldbeinASCIIorUTF-8format! * *LICENSE:Redistributionanduseinsourceandbinaryforms,withor *withoutmodification,arepermittedprovidedthatthefollowing *conditionsaremet:Redistributionsofsourcecodemustretainthe *abovecopyrightnotice,thislistofconditionsandthefollowing *disclaimer.Redistributionsinbinaryformmustreproducetheabove *copyrightnotice,thislistofconditionsandthefollowingdisclaimer *inthedocumentationand/orothermaterialsprovidedwiththe *distribution. * *THISSOFTWAREISPROVIDED``ASIS''ANDANYEXPRESSORIMPLIED *WARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIESOF *MERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEAREDISCLAIMED.IN *NOEVENTSHALLCONTRIBUTORSBELIABLEFORANYDIRECT,INDIRECT, *INCIDENTAL,SPECIAL,EXEMPLARY,ORCONSEQUENTIALDAMAGES(INCLUDING, *BUTNOTLIMITEDTO,PROCUREMENTOFSUBSTITUTEGOODSORSERVICES;LOSS *OFUSE,DATA,ORPROFITS;ORBUSINESSINTERRUPTION)HOWEVERCAUSEDAND *ONANYTHEORYOFLIABILITY,WHETHERINCONTRACT,STRICTLIABILITY,OR *TORT(INCLUDINGNEGLIGENCEOROTHERWISE)ARISINGINANYWAYOUTOFTHE *USEOFTHISSOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOFSUCH *DAMAGE. * *@category *@packageServices_JSON *@authorMichalMigurski<mike-json@teczno.com> *@authorMattKnapp<mdknapp[at]gmail[dot]com> *@authorBrettStimmerman<brettstimmerman[at]gmail[dot]com> *@copyright2005MichalMigurski *@versionCVS:$Id:JSON.php,v1.312006/06/2805:54:17migurskiExp$ *@licensehttp://www.opensource.org/licenses/bsd-license.php *@linkhttp://pear.php.net/pepr/pepr-proposal-show.php?id=198 */ /** *MarkerconstantforServices_JSON::decode(),usedtoflagstackstate */ define('SERVICES_JSON_SLICE',1); /** *MarkerconstantforServices_JSON::decode(),usedtoflagstackstate */ define('SERVICES_JSON_IN_STR',2); /** *MarkerconstantforServices_JSON::decode(),usedtoflagstackstate */ define('SERVICES_JSON_IN_ARR',3); /** *MarkerconstantforServices_JSON::decode(),usedtoflagstackstate */ define('SERVICES_JSON_IN_OBJ',4); /** *MarkerconstantforServices_JSON::decode(),usedtoflagstackstate */ define('SERVICES_JSON_IN_CMT',5); /** *BehaviorswitchforServices_JSON::decode() */ define('SERVICES_JSON_LOOSE_TYPE',16); /** *BehaviorswitchforServices_JSON::decode() */ define('SERVICES_JSON_SUPPRESS_ERRORS',32); /** *ConvertstoandfromJSONformat. * *Briefexampleofuse: * *<code> *//createanewinstanceofServices_JSON *$json=newServices_JSON(); * *//convertacomplexevaluetoJSONnotation,andsendittothebrowser *$value=array('foo','bar',array(1,2,'baz'),array(3,array(4))); *$output=$json->encode($value); * *print($output); *//prints:["foo","bar",[1,2,"baz"],[3,[4]]] * *//acceptincomingPOSTdata,assumedtobeinJSONnotation *$input=file_get_contents('php://input',1000000); *$value=$json->decode($input); *</code> */ classServices_JSON { /** *constructsanewJSONinstance * *@paramint$useobjectbehaviorflags;combinewithboolean-OR * *possiblevalues: *-SERVICES_JSON_LOOSE_TYPE:loosetyping. *"{...}"syntaxcreatesassociativearrays *insteadofobjectsindecode(). *-SERVICES_JSON_SUPPRESS_ERRORS:errorsuppression. *Valueswhichcan'tbeencoded(e.g.resources) *appearasNULLinsteadofthrowingerrors. *Bydefault,adeeply-nestedresourcewill *bubbleupwithanerror,soallreturnvalues *fromencode()shouldbecheckedwithisError() */ functionServices_JSON($use=0) { $this->use=$use; } /** *convertastringfromoneUTF-16chartooneUTF-8char * *Normallyshouldbehandledbymb_convert_encoding,but *providesaslowerPHP-onlymethodforinstallations *thatlackthemultibyestringextension. * *@paramstring$utf16UTF-16character *@returnstringUTF-8character *@accessprivate */ functionutf162utf8($utf16) { //ohpleaseohpleaseohpleaseohpleaseohplease if(function_exists('mb_convert_encoding')){ returnmb_convert_encoding($utf16,'UTF-8','UTF-16'); } $bytes=(ord($utf16{0})<<8)|ord($utf16{1}); switch(true){ case((0x7F&$bytes)==$bytes): //thiscaseshouldneverbereached,becauseweareinASCIIrange //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 returnchr(0x7F&$bytes); case(0x07FF&$bytes)==$bytes: //returna2-byteUTF-8character //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 returnchr(0xC0|(($bytes>>6)&0x1F)) .chr(0x80|($bytes&0x3F)); case(0xFFFF&$bytes)==$bytes: //returna3-byteUTF-8character //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 returnchr(0xE0|(($bytes>>12)&0x0F)) .chr(0x80|(($bytes>>6)&0x3F)) .chr(0x80|($bytes&0x3F)); } //ignoringUTF-32fornow,sorry return''; } /** *convertastringfromoneUTF-8chartooneUTF-16char * *Normallyshouldbehandledbymb_convert_encoding,but *providesaslowerPHP-onlymethodforinstallations *thatlackthemultibyestringextension. * *@paramstring$utf8UTF-8character *@returnstringUTF-16character *@accessprivate */ functionutf82utf16($utf8) { //ohpleaseohpleaseohpleaseohpleaseohplease if(function_exists('mb_convert_encoding')){ returnmb_convert_encoding($utf8,'UTF-16','UTF-8'); } switch(strlen($utf8)){ case1: //thiscaseshouldneverbereached,becauseweareinASCIIrange //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return$utf8; case2: //returnaUTF-16characterfroma2-byteUTF-8char //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 returnchr(0x07&(ord($utf8{0})>>2)) .chr((0xC0&(ord($utf8{0})<<6)) |(0x3F&ord($utf8{1}))); case3: //returnaUTF-16characterfroma3-byteUTF-8char //see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 returnchr((0xF0&(ord($utf8{0})<<4)) |(0x0F&(ord($utf8{1})>>2))) .chr((0xC0&(ord($utf8{1})<<6)) |(0x7F&ord($utf8{2}))); } //ignoringUTF-32fornow,sorry return''; } /** *encodesanarbitraryvariableintoJSONformat * *@parammixed$varanynumber,boolean,string,array,orobjecttobeencoded. *seeargument1toServices_JSON()aboveforarray-parsingbehavior. *ifvarisastrng,notethatencode()alwaysexpectsit *tobeinASCIIorUTF-8format! * *@returnmixedJSONstringrepresentationofinputvaroranerrorifaproblemoccurs *@accesspublic */ functionencode($var) { switch(gettype($var)){ case'boolean': return$var?'true':'false'; case'NULL': return'null'; case'integer': return(int)$var; case'double': case'float': return(float)$var; case'string': //STRINGSAREEXPECTEDTOBEINASCIIORUTF-8FORMAT $ascii=''; $strlen_var=strlen($var); /* *Iterateovereverycharacterinthestring, *escapingwithaslashorencodingtoUTF-8wherenecessary */ for($c=0;$c<$strlen_var;++$c){ $ord_var_c=ord($var{$c}); switch(true){ case$ord_var_c==0x08: $ascii.='\b'; break; case$ord_var_c==0x09: $ascii.='\t'; break; case$ord_var_c==0x0A: $ascii.='\n'; break; case$ord_var_c==0x0C: $ascii.='\f'; break; case$ord_var_c==0x0D: $ascii.='\r'; break; case$ord_var_c==0x22: case$ord_var_c==0x2F: case$ord_var_c==0x5C: //doublequote,slash,slosh $ascii.='\\'.$var{$c}; break; case(($ord_var_c>=0x20)&&($ord_var_c<=0x7F)): //charactersU-00000000-U-0000007F(sameasASCII) $ascii.=$var{$c}; break; case(($ord_var_c&0xE0)==0xC0): //charactersU-00000080-U-000007FF,mask110XXXXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char=pack('C*',$ord_var_c,ord($var{$c+1})); $c+=1; $utf16=$this->utf82utf16($char); $ascii.=sprintf('\u%04s',bin2hex($utf16)); break; case(($ord_var_c&0xF0)==0xE0): //charactersU-00000800-U-0000FFFF,mask1110XXXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char=pack('C*',$ord_var_c, ord($var{$c+1}), ord($var{$c+2})); $c+=2; $utf16=$this->utf82utf16($char); $ascii.=sprintf('\u%04s',bin2hex($utf16)); break; case(($ord_var_c&0xF8)==0xF0): //charactersU-00010000-U-001FFFFF,mask11110XXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char=pack('C*',$ord_var_c, ord($var{$c+1}), ord($var{$c+2}), ord($var{$c+3})); $c+=3; $utf16=$this->utf82utf16($char); $ascii.=sprintf('\u%04s',bin2hex($utf16)); break; case(($ord_var_c&0xFC)==0xF8): //charactersU-00200000-U-03FFFFFF,mask111110XX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char=pack('C*',$ord_var_c, ord($var{$c+1}), ord($var{$c+2}), ord($var{$c+3}), ord($var{$c+4})); $c+=4; $utf16=$this->utf82utf16($char); $ascii.=sprintf('\u%04s',bin2hex($utf16)); break; case(($ord_var_c&0xFE)==0xFC): //charactersU-04000000-U-7FFFFFFF,mask1111110X //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char=pack('C*',$ord_var_c, ord($var{$c+1}), ord($var{$c+2}), ord($var{$c+3}), ord($var{$c+4}), ord($var{$c+5})); $c+=5; $utf16=$this->utf82utf16($char); $ascii.=sprintf('\u%04s',bin2hex($utf16)); break; } } return'"'.$ascii.'"'; case'array': /* *AsperJSONspecifanyarraykeyisnotaninteger *wemusttreatthethewholearrayasanobject.We *alsotrytocatchasparselypopulatedassociative *arraywithnumerickeysherebecausesomeJSengines *willcreateanarraywithemptyindexesupto *max_indexwhichcancausememoryissuesandbecause *thekeys,whichmayberelevant,willberemapped *otherwise. * *AspertheECMAandJSONspecificationanobjectmay *haveanystringasaproperty.Unfortunatelydueto *aholeintheECMAspecificationifthekeyisa *ECMAreservedwordorstartswithadigitthe *parameterisonlyaccessibleusingECMAScript's *bracketnotation. */ //treatasaJSONobject if(is_array($var)&&count($var)&&(array_keys($var)!==range(0,sizeof($var)-1))){ $properties=array_map(array($this,'name_value'), array_keys($var), array_values($var)); foreach($propertiesas$property){ if(Services_JSON::isError($property)){ return$property; } } return'{'.join(',',$properties).'}'; } //treatitlikearegulararray $elements=array_map(array($this,'encode'),$var); foreach($elementsas$element){ if(Services_JSON::isError($element)){ return$element; } } return'['.join(',',$elements).']'; case'object': $vars=get_object_vars($var); $properties=array_map(array($this,'name_value'), array_keys($vars), array_values($vars)); foreach($propertiesas$property){ if(Services_JSON::isError($property)){ return$property; } } return'{'.join(',',$properties).'}'; default: return($this->use&SERVICES_JSON_SUPPRESS_ERRORS) ?'null' :newServices_JSON_Error(gettype($var)."cannotbeencodedasJSONstring"); } } /** *array-walkingfunctionforuseingeneratingJSON-formattedname-valuepairs * *@paramstring$namenameofkeytouse *@parammixed$valuereferencetoanarrayelementtobeencoded * *@returnstringJSON-formattedname-valuepair,like'"name":value' *@accessprivate */ functionname_value($name,$value) { $encoded_value=$this->encode($value); if(Services_JSON::isError($encoded_value)){ return$encoded_value; } return$this->encode(strval($name)).':'.$encoded_value; } /** *reduceastringbyremovingleadingandtrailingcommentsandwhitespace * *@param$strstringstringvaluetostripofcommentsandwhitespace * *@returnstringstringvaluestrippedofcommentsandwhitespace *@accessprivate */ functionreduce_string($str) { $str=preg_replace(array( //eliminatesinglelinecommentsin'//...'form '#^\s*//(.+)$#m', //eliminatemulti-linecommentsin'/*...*/'form,atstartofstring '#^\s*/\*(.+)\*/#Us', //eliminatemulti-linecommentsin'/*...*/'form,atendofstring '#/\*(.+)\*/\s*$#Us' ),'',$str); //eliminateextraneousspace returntrim($str); } /** *decodesaJSONstringintoappropriatevariable * *@paramstring$strJSON-formattedstring * *@returnmixednumber,boolean,string,array,orobject *correspondingtogivenJSONinputstring. *Seeargument1toServices_JSON()aboveforobject-outputbehavior. *Notethatdecode()alwaysreturnsstrings *inASCIIorUTF-8format! *@accesspublic */ functiondecode($str) { $str=$this->reduce_string($str); switch(strtolower($str)){ case'true': returntrue; case'false': returnfalse; case'null': returnnull; default: $m=array(); if(is_numeric($str)){ //Lookie-loo,it'sanumber //Thiswouldworkonitsown,butI'mtryingtobe //goodaboutreturningintegerswhereappropriate: //return(float)$str; //Returnfloatorint,asappropriate return((float)$str==(integer)$str) ?(integer)$str :(float)$str; }elseif(preg_match('/^("|\').*(\1)$/s',$str,$m)&&$m[1]==$m[2]){ //STRINGSRETURNEDINUTF-8FORMAT $delim=substr($str,0,1); $chrs=substr($str,1,-1); $utf8=''; $strlen_chrs=strlen($chrs); for($c=0;$c<$strlen_chrs;++$c){ $substr_chrs_c_2=substr($chrs,$c,2); $ord_chrs_c=ord($chrs{$c}); switch(true){ case$substr_chrs_c_2=='\b': $utf8.=chr(0x08); ++$c; break; case$substr_chrs_c_2=='\t': $utf8.=chr(0x09); ++$c; break; case$substr_chrs_c_2=='\n': $utf8.=chr(0x0A); ++$c; break; case$substr_chrs_c_2=='\f': $utf8.=chr(0x0C); ++$c; break; case$substr_chrs_c_2=='\r': $utf8.=chr(0x0D); ++$c; break; case$substr_chrs_c_2=='\\"': case$substr_chrs_c_2=='\\\'': case$substr_chrs_c_2=='\\\\': case$substr_chrs_c_2=='\\/': if(($delim=='"'&&$substr_chrs_c_2!='\\\'')|| ($delim=="'"&&$substr_chrs_c_2!='\\"')){ $utf8.=$chrs{++$c}; } break; casepreg_match('/\\\u[0-9A-F]{4}/i',substr($chrs,$c,6)): //single,escapedunicodecharacter $utf16=chr(hexdec(substr($chrs,($c+2),2))) .chr(hexdec(substr($chrs,($c+4),2))); $utf8.=$this->utf162utf8($utf16); $c+=5; break; case($ord_chrs_c>=0x20)&&($ord_chrs_c<=0x7F): $utf8.=$chrs{$c}; break; case($ord_chrs_c&0xE0)==0xC0: //charactersU-00000080-U-000007FF,mask110XXXXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8.=substr($chrs,$c,2); ++$c; break; case($ord_chrs_c&0xF0)==0xE0: //charactersU-00000800-U-0000FFFF,mask1110XXXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8.=substr($chrs,$c,3); $c+=2; break; case($ord_chrs_c&0xF8)==0xF0: //charactersU-00010000-U-001FFFFF,mask11110XXX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8.=substr($chrs,$c,4); $c+=3; break; case($ord_chrs_c&0xFC)==0xF8: //charactersU-00200000-U-03FFFFFF,mask111110XX //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8.=substr($chrs,$c,5); $c+=4; break; case($ord_chrs_c&0xFE)==0xFC: //charactersU-04000000-U-7FFFFFFF,mask1111110X //seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8.=substr($chrs,$c,6); $c+=5; break; } } return$utf8; }elseif(preg_match('/^\[.*\]$/s',$str)||preg_match('/^\{.*\}$/s',$str)){ //array,orobjectnotation if($str{0}=='['){ $stk=array(SERVICES_JSON_IN_ARR); $arr=array(); }else{ if($this->use&SERVICES_JSON_LOOSE_TYPE){ $stk=array(SERVICES_JSON_IN_OBJ); $obj=array(); }else{ $stk=array(SERVICES_JSON_IN_OBJ); $obj=newstdClass(); } } array_push($stk,array('what'=>SERVICES_JSON_SLICE, 'where'=>0, 'delim'=>false)); $chrs=substr($str,1,-1); $chrs=$this->reduce_string($chrs); if($chrs==''){ if(reset($stk)==SERVICES_JSON_IN_ARR){ return$arr; }else{ return$obj; } } //print("\nparsing{$chrs}\n"); $strlen_chrs=strlen($chrs); for($c=0;$c<=$strlen_chrs;++$c){ $top=end($stk); $substr_chrs_c_2=substr($chrs,$c,2); if(($c==$strlen_chrs)||(($chrs{$c}==',')&&($top['what']==SERVICES_JSON_SLICE))){ //foundacommathatisnotinsideastring,array,etc., //ORwe'vereachedtheendofthecharacterlist $slice=substr($chrs,$top['where'],($c-$top['where'])); array_push($stk,array('what'=>SERVICES_JSON_SLICE,'where'=>($c+1),'delim'=>false)); //print("Foundsplitat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n"); if(reset($stk)==SERVICES_JSON_IN_ARR){ //weareinanarray,sojustpushanelementontothestack array_push($arr,$this->decode($slice)); }elseif(reset($stk)==SERVICES_JSON_IN_OBJ){ //weareinanobject,sofigure //outthepropertynameandsetan //elementinanassociativearray, //fornow $parts=array(); if(preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis',$slice,$parts)){ //"name":valuepair $key=$this->decode($parts[1]); $val=$this->decode($parts[2]); if($this->use&SERVICES_JSON_LOOSE_TYPE){ $obj[$key]=$val; }else{ $obj->$key=$val; } }elseif(preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis',$slice,$parts)){ //name:valuepair,wherenameisunquoted $key=$parts[1]; $val=$this->decode($parts[2]); if($this->use&SERVICES_JSON_LOOSE_TYPE){ $obj[$key]=$val; }else{ $obj->$key=$val; } } } }elseif((($chrs{$c}=='"')||($chrs{$c}=="'"))&&($top['what']!=SERVICES_JSON_IN_STR)){ //foundaquote,andwearenotinsideastring array_push($stk,array('what'=>SERVICES_JSON_IN_STR,'where'=>$c,'delim'=>$chrs{$c})); //print("Foundstartofstringat{$c}\n"); }elseif(($chrs{$c}==$top['delim'])&& ($top['what']==SERVICES_JSON_IN_STR)&& ((strlen(substr($chrs,0,$c))-strlen(rtrim(substr($chrs,0,$c),'\\')))%2!=1)){ //foundaquote,we'reinastring,andit'snotescaped //weknowthatit'snotescapedbecasethereis_not_an //oddnumberofbackslashesattheendofthestringsofar array_pop($stk); //print("Foundendofstringat{$c}:".substr($chrs,$top['where'],(1+1+$c-$top['where']))."\n"); }elseif(($chrs{$c}=='[')&& in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){ //foundaleft-bracket,andweareinanarray,object,orslice array_push($stk,array('what'=>SERVICES_JSON_IN_ARR,'where'=>$c,'delim'=>false)); //print("Foundstartofarrayat{$c}\n"); }elseif(($chrs{$c}==']')&&($top['what']==SERVICES_JSON_IN_ARR)){ //foundaright-bracket,andwe'reinanarray array_pop($stk); //print("Foundendofarrayat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n"); }elseif(($chrs{$c}=='{')&& in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){ //foundaleft-brace,andweareinanarray,object,orslice array_push($stk,array('what'=>SERVICES_JSON_IN_OBJ,'where'=>$c,'delim'=>false)); //print("Foundstartofobjectat{$c}\n"); }elseif(($chrs{$c}=='}')&&($top['what']==SERVICES_JSON_IN_OBJ)){ //foundaright-brace,andwe'reinanobject array_pop($stk); //print("Foundendofobjectat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n"); }elseif(($substr_chrs_c_2=='/*')&& in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){ //foundacommentstart,andweareinanarray,object,orslice array_push($stk,array('what'=>SERVICES_JSON_IN_CMT,'where'=>$c,'delim'=>false)); $c++; //print("Foundstartofcommentat{$c}\n"); }elseif(($substr_chrs_c_2=='*/')&&($top['what']==SERVICES_JSON_IN_CMT)){ //foundacommentend,andwe'reinonenow array_pop($stk); $c++; for($i=$top['where'];$i<=$c;++$i) $chrs=substr_replace($chrs,'',$i,1); //print("Foundendofcommentat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n"); } } if(reset($stk)==SERVICES_JSON_IN_ARR){ return$arr; }elseif(reset($stk)==SERVICES_JSON_IN_OBJ){ return$obj; } } } } /** *@todoUltimately,thisshouldjustcallPEAR::isError() */ functionisError($data,$code=null) { if(class_exists('pear')){ returnPEAR::isError($data,$code); }elseif(is_object($data)&&(get_class($data)=='services_json_error'||is_subclass_of($data,'services_json_error'))){ returntrue; } returnfalse; } } if(class_exists('PEAR_Error')){ classServices_JSON_ErrorextendsPEAR_Error { functionServices_JSON_Error($message='unknownerror',$code=null,$mode=null,$options=null,$userinfo=null) { parent::PEAR_Error($message,$code,$mode,$options,$userinfo); } } }else{ /** *@todoUltimately,thisclassshallbedescendedfromPEAR_Error */ classServices_JSON_Error { functionServices_JSON_Error($message='unknownerror',$code=null,$mode=null,$options=null,$userinfo=null) { } } } ?>
希望本文所述对大家的php程序设计有所帮助。