"PHP" / Говнокод #24448 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
public static function PhpToJSObject($arData, $bWS = false, $bSkipTilda = false, $bExtType = false)
	{
		static $use_bx_encode = null;
		if (!isset($use_bx_encode))
			$use_bx_encode = function_exists('bx_js_encode');
		if ($use_bx_encode)
			return bx_js_encode($arData, $bWS, $bSkipTilda, $bExtType);

		switch(gettype($arData))
		{
		case "string":
			if(preg_match("#['\"\\n\\r<\\\\\x80]#", $arData))
				return "'".CUtil::JSEscape($arData)."'";
			else
				return "'".$arData."'";
		case "array":
			$i = -1;
			$j = -1;
			foreach($arData as $j => $temp)
			{
				$i++;
				if ($j !== $i)
					break;
			}

			if($j === $i)
			{
				$res = '[';
				$first = true;
				foreach($arData as $key => $value)
				{
					if($first)
						$first = false;
					else
						$res .= ',';

					switch(gettype($value))
					{
					case "string":
						if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
							$res .= "'".CUtil::JSEscape($value)."'";
						else
							$res .= "'".$value."'";
						break;
					case "array":
						$res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);
						break;
					case "boolean":
						if($value === true)
							$res .= 'true';
						else
							$res .= 'false';
						break;
					case "integer":
					case "double":
						if ($bExtType)
							$res .= $value;
						else
							$res .= "'".$value."'";
						break;
					default:
						if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
							$res .= "'".CUtil::JSEscape($value)."'";
						else
							$res .= "'".$value."'";
						break;
					}
				}
				$res .= ']';
				return $res;
			}

			$sWS = ','.($bWS ? "\n" : '');
			$res = ($bWS ? "\n" : '').'{';
			$first = true;
			foreach($arData as $key => $value)
			{
				if ($bSkipTilda && substr($key, 0, 1) == '~')
					continue;

				if($first)
					$first = false;
				else
					$res .= $sWS;

				if(preg_match("#['\"\\n\\r<\\\\\x80]#", $key))
					$res .= "'".CUtil::JSEscape($key)."':";
				else
					$res .= "'".$key."':";

				switch(gettype($value))
				{
				case "string":
					if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
						$res .= "'".CUtil::JSEscape($value)."'";
					else
						$res .= "'".$value."'";
					break;
				case "array":
					$res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);

В ядре битрикса в файле bitrix/modules/main/tools.php на 4613 строке, длинной в 141 строку (жаль здесь ограничение на 100 строк), есть замечательный метод который по сути почти повторяет json_encode().

Почти - это потому, что это говно генерит невалидный json (использует одинарные ковычки), да еще не учитывает типы (true превратится в строку 'true').

Битриксоиды этим подосрали даже не веб-студиям, они просто нагенерировали себе много дополнительной работы на долгое время вперед.

Желаю им держать эту планку, и никогда не расти.

Запостил: gitkv gitkv, (Updated )

Комментарии (3) RSS

  • Умение изобретать квадратноколесный велосипед это пять.
    Теперь пускай XmlToPHP напишут
    Ответить
    • Если Вы считаете, что они не написали свой парсер XML, то вы очень жестко заблуждаетесь))
      Когда-то давно, когда еще только начинал знакомство с битриксом и PHP, решил использовать для решения реальной задачи их XML парсер (потому что не знал, какие вообще есть способы решить задачу). Все настроил, натравили скрипт на реальные данные. И оказалось, что работает очень долго, сервер падает и т.д. Тогда я чуть-чуть погуглил, заменил парсер на SimpleXML. И оказалось, что все работает прекрасно, быстро, никаких проблем больше не возникало. Вот в тот момент я понял, что из себя представляют все эти велосипеды от битрикса.
      А вообще да, PhpToJSObject это тот еще велосипед. Они в своем ядре его используют обычно, чтобы присваивать js переменной и потом использовать. Вообще я так думаю, они написали все эти велосипеды, чтобы битрикс работал на любом окружении, с любыми настройками сервера и т.д. Возможно, свой отпечаток наложил тот факт, что раньше большую долю составляло использование битрикса на кодировке 1251, где есть нюансы использования стандартных функций.

      А вообще. Это уже старое ядро. В новом ядре D7 ребята написали много новых велосипедов:
      http://bxapi.ru/src/?module_id=main&name=Json%3A%3Aencode
      http://bxapi.ru/src/?module_id=main&name=Json%3A%3Adecode
      По сути, теперь просто обертка для php функций.
      Ответить
  • > говно генерит невалидный json

    Судя по названию, оно генерить "JS", а не "JSON", так что норм.

    JsonToPhp слабо запилить?
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8