Pull to refresh

Псевдо-пространства имен

Reading time 2 min
Views 769
В PHP 5.3 добавлена поддержка пространств имен, но эта версия пока слабо распространена и непригодна для промышленного использования в распространяемых проектах. А пока новая версия в пути, я сделал простую замену пространств имен для переменных.


Эти функции можно использовать, когда нужно передать переменные из одного включаемого скрипта в другой, но неизвестно что с ними может случиться по дороге. В конце первого скрипта вызываем функцию nsout() с идентификатором пространства и списком переменных, которые нужно сохранить, а перед использованием этих переменных во втором скрипте вызываем nsin() с идентификатором пространства.

Copy Source | Copy HTML
  1. // Сохрняем переменные пространства имен
  2. function nsout($ns, $vars = array()) {
  3.     global $NS;
  4.     foreach ($vars as $var)
  5.         eval("global $$var; \$NS[\$ns][\$var] = $$var;");
  6. }
  7.  
  8. // Восстанавливаем переменные пространства имен
  9. function nsin($ns) {
  10.     global $NS;
  11.     $code = '';
  12.     if (!is_array($NS)) return;
  13.     foreach ($NS[$ns] as $name => $value)
  14.         $code .= "<br/>            global $$name;<br/>            $$name = " . php_var_map($value) . ";<br/>        ";
  15.     eval($code);
  16. }
  17.  
  18. function php_var_map($var) {
  19.     if (!is_array($var))
  20.         return "'$var'";
  21.     else {
  22.         $code = '';
  23.         foreach ($var as $name => $value)
  24.             $code .= ($code ? ', ' : '') . "'$name' => " . php_var_map($value);
  25.         return "array($code)";
  26.     }
  27. }


UPD: Как подсказал homm есть две замечательные функции compact() и extract(), которые как раз для этого и предназначены. Так что можно писать так:

$NS['ns1'] = compact('var1', 'var2', 'var3');

А потом

extract($NS['ns1']);

Кроме того функция extract() дает дополнительный контроль над извлечением переменных, позволяя добавлять префикс, и контролировать конфликты.
Tags:
Hubs:
-11
Comments 35
Comments Comments 35

Articles