На странице произошла ошибка #S51. Свяжитесь с вебмастером. PHP 5.6 и PHP 7 на русском: Функция var_export() - Выводит в браузер или возвращает интерпретируемое строковое представление переменной

var_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

var_exportВыводит в браузер или возвращает интерпретируемое строковое представление переменной

Описание

mixed var_export ( mixed $expression [, bool $return = false ] )

var_export() возвращает структурированную информацию о данной переменной. Функция аналогична var_dump() за одним исключением: возвращаемое представление является полноценным PHP кодом.

Список параметров

expression

Переменная, которую необходимо экспортировать.

return

Если передано и значение равно TRUE, var_export() вернет представление переменной вместо его вывода.

Возвращаемые значения

Возвращает представление переменной, если параметр return передан и равен TRUE. В противном случае функция возвращает NULL.

Примечания

Замечание:

При использовании параметра return данная функция использует внутреннюю буферизацию вывода, поэтому она не может быть использована внутри callback-функции ob_start().

Список изменений

Версия Описание
5.1.0 Стало возможным экспортировать классы и массивы, содержащие другие классы, используя магический метод __set_state().

Примеры

Пример #1 Примеры использования var_export()

<?php
$a 
= array (12, array ("a""b""c"));
var_export($a);
?>

Результат выполнения данного примера:

array (
  0 => 1,
  1 => 2,
  2 => 
  array (
    0 => 'a',
    1 => 'b',
    2 => 'c',
  ),
)
<?php

$b 
3.1;
$v var_export($btrue);
echo 
$v;

?>

Результат выполнения данного примера:

3.1

Пример #2 Экспорт классов в PHP с версии 5.1.0

<?php
class { public $var; }
$a = new A;
$a->var 5;
var_export($a);
?>

Результат выполнения данного примера:

A::__set_state(array(
   'var' => 5,
))

Пример #3 Использование __set_state() (в PHP с версии 5.1.0)

<?php
class A
{
    public 
$var1;
    public 
$var2;

    public static function 
__set_state($an_array)
    {
        
$obj = new A;
        
$obj->var1 $an_array['var1'];
        
$obj->var2 $an_array['var2'];
        return 
$obj;
    }
}

$a = new A;
$a->var1 5;
$a->var2 'foo';

eval(
'$b = ' var_export($atrue) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);
?>

Результат выполнения данного примера:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Примечания

Замечание:

Переменные типа resource не могут быть экспортированы с помощью этой функции.

Замечание:

var_export() не обрабатывает циклические ссылки, так как было бы почти невозможно сгенерировать интерпретируемый PHP код для такого случая. Если необходимо производить какие-то действия с полным представлением массива или объекта, используйте функцию serialize().

Внимание

При экспорте объектов функцией var_export(), лидирующий слеш не добавляется в имя класса с указанным пространством имен для наилучшей обратной совместимости.

Смотрите также

  • print_r() - Выводит удобочитаемую информацию о переменной
  • serialize() - Генерирует пригодное для хранения представление переменной
  • var_dump() - Выводит информацию о переменной

Коментарии

[john holmes]
True, but that method would require you to open and read the file into a variable and then unserialize it into another variable.

Using a file created with var_export() could simply be include()'d, which will be less code and faster. 

[kaja]
If you are trying to find a way to temporarily save variables into some other file, check out serialize() and unserialize() instead - this one is more useful for its readable property, very handy while debugging.

[original post]
If you're like me, you're wondering why a function that outputs "correct PHP syntax" is useful. This function can be useful in implementing a cache system. You can var_export() the array into a variable and write it into a file. Writing a string such as

<?php
$string 
'<?php $array = ' $data '; ?>';
?>

where $data is the output of var_export() can create a file that can be easily include()d back into the script to recreate $array. 

The raw output of var_export() could also be eval()d to recreate the array.

---John Holmes...
2003-10-16 03:43:11
http://php5.kiev.ua/manual/ru/function.var-export.html
var_export() differs from print_r() for variables that are resources, with print_r() being more useful if you are using the function for debugging purposes.
e.g.
<?php
$res 
mysql_connect($dbhost$dbuser$dbpass);
print_r($res); //output: Resource id #14
var_export($res); //output: NULL
?>
2004-11-24 13:22:46
http://php5.kiev.ua/manual/ru/function.var-export.html
<roman at DIESPAM dot feather dot org dot ru>, your function has inefficiencies and problems. I probably speak for everyone when I ask you to test code before you add to the manual.

Since the issue of whitespace only comes up when exporting arrays, you can use the original var_export() for all other variable types. This function does the job, and, from the outside, works the same as var_export().

<?php

function var_export_min($var$return false) {
    if (
is_array($var)) {
       
$toImplode = array();
        foreach (
$var as $key => $value) {
           
$toImplode[] = var_export($keytrue).'=>'.var_export_min($valuetrue);
        }
       
$code 'array('.implode(','$toImplode).')';
        if (
$return) return $code;
        else echo 
$code;
    } else {
        return 
var_export($var$return);
    }
}

?>
2005-07-04 12:50:05
http://php5.kiev.ua/manual/ru/function.var-export.html
Автор:
Like previously reported, i find var_export() frustrating when dealing with recursive structures.  Doing a :

<?php
var_export
($GLOBALS);
?>

fails.  Interestingly, var_dump() has some logic to avoid recursive references.  So :

<?php
var_dump
($GLOBALS);
?>

works (while being more ugly).  Unlike var_export(), var_dump() has no option to return the string, so output buffering logic is required if you want to direct the output.
2007-05-23 20:47:32
http://php5.kiev.ua/manual/ru/function.var-export.html
I have been looking for the best method to store data in cache files.

First, I've identified two limitations of var_export verus serialize.  It can't store internal references inside of an array and it can't store a nested object or an array containing objects before PHP 5.1.0.

However, I could deal with both of those so I created a benchmark.  I used a single array containing from 10 to 150 indexes.  I've generate the elements' values randomly using booleans, nulls, integers, floats, and some nested arrays (the nested arrays are smaller averaging 5 elements but created similarly).  The largest percentage of elements are short strings around 10-15 characters.  While there is a small number of long strings (around 500 characters).

Benchmarking returned these results for 1000 * [total time] / [iterations (4000 in this case)]

serialize 3.656, 3.575, 3.68, 3.933, mean of 3.71
include 7.099, 5.42, 5.185, 6.076, mean of 5.95
eval 5.514, 5.204, 5.011, 5.788, mean of 5.38

Meaning serialize is around 1 and a half times faster than var_export for a single large array.  include and eval were consistently very close but eval was usually a few tenths faster (eval did better this particular set of trials than usual). An opcode cache like APC might make include faster, but otherwise serialize is the best choice.
2007-06-29 19:20:48
http://php5.kiev.ua/manual/ru/function.var-export.html
(This replaces my note of 3-July-2009. The original version produced no output if a variable contained an empty array, or an array consisting only of empty arrays. For example, $bigarray['x'] = array(); Also, I have added a second version of the function.)

The output can be difficult to decipher when looking at an array with many levels and many elements on each level. For example:

<?php
print ('$bigarray = ' var_export($bigarraytrue) . "\n");
?>

will return:

$bigarray = array(
... (500 lines skipped) ...
          'mod' => 'charlie',

Whereas the routine below can be called with:

<?php
recursive_print 
('$bigarray'$bigarray);
?>

and it will return:

$bigarray = array()
... (500 lines skipped) ...
$bigarray['foo']['bar']['0']['somethingelse']['mod'] = 'charlie'

Here's the function:

<?php
function recursive_print ($varname$varval) {
  if (! 
is_array($varval)):
    print 
$varname ' = ' $varval "<br>\n";
  else:
    print 
$varname " = array()<br>\n";
    foreach (
$varval as $key => $val):
     
recursive_print ($varname "['" $key "']"$val);
    endforeach;
  endif;
}
?>

For those who want a version that produces valid PHP code, use this version:

<?php
function recursive_print ($varname$varval) {
  if (! 
is_array($varval)):
    print 
$varname ' = ' var_export($varvaltrue) . ";<br>\n";
  else:
    print 
$varname " = array();<br>\n";
    foreach (
$varval as $key => $val):
     
recursive_print ($varname "[" var_export($keytrue) . "]"$val);
    endforeach;
  endif;
}
?>

If your output is to a text file and not an HTML page, remove the <br>s.
2009-07-07 13:32:07
http://php5.kiev.ua/manual/ru/function.var-export.html
NOTE: If an object Foo has __set_state() method, but if that object contains another object Bar with no __set_state() method implemented, the resulting PHP expression will not be eval()-able.

This is an example (object Test that contains an instance of Exception).

<?php

class Test
{
  public 
$one;
  public 
$two;
  public function 
__construct($one$two)
  {
   
$this->one $one;
   
$this->two $two;
  }
  public static function 
__set_state(array $array)
  {
    return new 
self($array['one'], $array['two']);
  }
}

$test = new Test('one', new Exception('test'));

$string var_export($testtrue);

/* $string =
Test::__set_state(array(
   'one' => 'one',
   'two' => 
  Exception::__set_state(array(
     'message' => 'test',
     'string' => '',
     'code' => 0,
     'file' => 'E:\\xampp\\htdocs\\test.Q.php',
     'line' => 35,
     'trace' => 
    array (
    ),
     'previous' => NULL,
  )),
))
*/

eval('$test2 = '.$string.';'); // Fatal error: Call to undefined method Exception::__set_state

?>

So avoid using var_export() on a complex array/object that contains other objects. Instead, use serialize() and unserialize() functions.

<?php

$string 
'unserialize('.var_export(serialize($test), true).')';

eval(
'$test2 = '.$string.';');

var_dump($test == $test2); // bool(true)

?>
2009-10-29 00:43:49
http://php5.kiev.ua/manual/ru/function.var-export.html
I didn't see this simple little item anywhere in the user notes. Maybe I'm blind!

Anyway, var_export and print_r both use spaces and carriage returns for formatting.  Sent to an html page, most of the formatting is lost. This simple function prints a nicely formatted array to an html screen:

<?php
function pretty_var($myArray){
    print 
str_replace(array("\n"," "),array("<br>","&nbsp;"), var_export($myArray,true))."<br>";
}
?>
2010-01-16 17:53:16
http://php5.kiev.ua/manual/ru/function.var-export.html
I learned the hard way that if var_export encounters a resource handle it exports it as "NULL", even if it is a valid handle. The documentation states that a handle cannot be exported, but it does not describe what happens if you try to do so anyway.

I had been using var_export in some debugging code while tracing a problem with a resource handle not being generated and ended up thinking that null handles were still being generated long after the problem had been fixed.
2010-06-17 19:50:41
http://php5.kiev.ua/manual/ru/function.var-export.html
Try this function instead of var_export($GLOBALS) or var_dump($GLOBALS) when all you want to know is the values of the variables you set on the current page.

<?php
function globalvars(){
   
$result=array();
   
$skip=array('GLOBALS','_ENV','HTTP_ENV_VARS',
                       
'_POST','HTTP_POST_VARS','_GET',
                       
'HTTP_GET_VARS',
                       
'_COOKIE',
                       
'HTTP_COOKIE_VARS','_SERVER',
                       
'HTTP_SERVER_VARS',
                       
'_FILES','HTTP_POST_FILES',
                       
'_REQUEST','HTTP_SESSION_VARS',
                       
'_SESSION');
    foreach(
$GLOBALS as $k=>$v)
        if(!
in_array($k,$skip))
           
$result[$k]=$v;
    return 
$result;
}
//functionglobalvars

var_export(globalvars());
?>
2010-10-06 16:57:56
http://php5.kiev.ua/manual/ru/function.var-export.html
Автор:
There is an even simpler way to have clean output from var_export and print_r in html pages:

<?php 
function pretty_var($myArray)

    echo 
"<pre>";
   
var_export($myArray);
    echo 
"</pre>";

?>
2011-11-11 11:13:54
http://php5.kiev.ua/manual/ru/function.var-export.html
WORKAROUND for error "Nesting level too deep - recursive dependency":
ob_start();
var_dump($GLOBALS);
$dataDump = ob_get_clean();
echo $dataDump;
2012-03-28 08:52:43
http://php5.kiev.ua/manual/ru/function.var-export.html
<?php
$closure 
= function(){};

var_export($closure);

// output: Closure::__set_state(array())
?>
2012-10-04 19:00:22
http://php5.kiev.ua/manual/ru/function.var-export.html
Автор:
When it comes to HTML output (as discussed below), it's all fun and games until someone pokes their eye out with a "<".

Surround it with "<pre>", but do remember to wrap it in htmlspecialchars() as well.
2013-07-10 19:33:55
http://php5.kiev.ua/manual/ru/function.var-export.html
Looks like since version 5.4.22 var_export uses the serialize_precision ini setting, rather than the precision one used for normal output of floating-point numbers.
As a consequence since version 5.4.22 for example var_export(1.1) will output 1.1000000000000001 (17 is default precision value) and not 1.1 as before. 

<?php 
//ouput 1.1000000000000001
var_export(1.1)
 
?>
2013-11-29 11:55:30
http://php5.kiev.ua/manual/ru/function.var-export.html
I found that my complex type was exporting with 
  stdClass::__set_state()
in places. Not only was that strange and messy, it cannot be eval()-ed back in at all. Fatal error. Doh!

However a quick string-replace tidy-up of the result rendered it valid again.

    $macro = var_export($data, TRUE);
    $macro = str_replace("stdClass::__set_state", "(object)", $macro);
    $macro = '$data = ' . $macro . ';';

And now the string I output *can* be evaluated back in again.
2014-01-10 16:11:54
http://php5.kiev.ua/manual/ru/function.var-export.html
Автор:
It doesn't appear to be documented, but the behaviour of `var_export()` changed in PHP 7.

Previously, `var_export(3.)` returned "3", now it returns "3.0".
2016-01-29 23:09:09
http://php5.kiev.ua/manual/ru/function.var-export.html
/**
 * var_export() with square brackets and indented 4 spaces.
 */
<?php
function varexport($expression$return=FALSE) {
   
$export var_export($expressionTRUE);
   
$export preg_replace("/^([ ]*)(.*)/m"'$1$1$2'$export);
   
$array preg_split("/\r\n|\n|\r/"$export);
   
$array preg_replace(["/\s*array\s\($/""/\)(,)?$/""/\s=>\s$/"], [NULL']$1'' => ['], $array);
   
$export join(PHP_EOLarray_filter(["["] + $array));
    if ((bool)
$return) return $export; else echo $export;
}
2018-06-18 21:24:49
http://php5.kiev.ua/manual/ru/function.var-export.html
Just for fun, trying to understand the definition of "returns parsable string"....any type of variable passed to var_export, the return value will be a typecasted as string...

<?php 

$var 
1;
var_dump($var); //type is int as expected 
echo "<br>";
$var_after_export var_export($var,true); //returning $var will now makes it a string
var_dump($var_after_export);

?>
2019-05-01 23:24:57
http://php5.kiev.ua/manual/ru/function.var-export.html
I improved my previous varexport().

<?php
/**
 * PHP var_export() with short array syntax (square brackets) indented 2 spaces.
 *
 * NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
 * @link https://www.php.net/manual/en/function.var-export.php
 */
function varexport($expression$return=FALSE) {
   
$export var_export($expressionTRUE);
   
$patterns = [
       
"/array \(/" => '[',
       
"/^([ ]*)\)(,?)$/m" => '$1]$2',
       
"/=>[ ]?\n[ ]+\[/" => '=> [',
       
"/([ ]*)(\'[^\']+\') => ([\[\'])/" => '$1$2 => $3',
    ];
   
$export preg_replace(array_keys($patterns), array_values($patterns), $export);
    if ((bool)
$return) return $export; else echo $export;
}

$array = [
   
'str' => 'Test
       spaces'
,
       
=> 33,
       
=> TRUE,
       [
3,4,'d',[]],
   
'arr' => [
       
'text with spaces' => '[Tes\'t"s":
 => [
 => 
  [
   {
      spaces'
,
    ],
   
"str2" => "Test's'
 } spaces"
,
   
'arr2' => [
       
'text with spaces' => [
           
'arr3' => [
               
'text with spaces' => 'Te": "st \' => [
      spaces'
,
            ],
        ],
    ],
];
varexport($array);
// Result:
```
[
  'str' => 'Test
       spaces',
  0 => 33,
  1 => true,
  2 => [
    0 => 3,
    1 => 4,
    2 => 'd',
    3 => [
    ],
  ],
  'arr' => [
    'text with spaces' => '[Tes\'t"s":
 => [
 => [
   {
      spaces',
  ],
  'str2' => 'Test\'s\'
 } spaces',
  'arr2' => [
    'text with spaces' => [
      'arr3' => [
        'text with spaces' => 'Te": "st \' => [
      spaces',
      ],
    ],
  ],
]
```
NOTEThe only issue is when a string value has `=>\n[`, it will get converted to `=> [`
2019-09-13 06:52:43
http://php5.kiev.ua/manual/ru/function.var-export.html
A small function for exporting variables as string, supporting nested arrays, with indented output, blockquoted and with double quotes, that can be pasted back in code.

<?php
function dump($value) {
  function 
_dump($value$indent 0) {
    if (!
is_array($value)) return json_encode($valueJSON_NUMERIC_CHECK);
    foreach(
$value as $key => $item$result .= (ifset($result) ? ",\r\n" str_repeat(" "$indent 2) : "") . json_encode($key) . " => " _dump($item$indent 2);
    return 
"[\r\n" str_repeat(" "$indent 2) . "$result\r\n" str_repeat(" "$indent) . "]";
  }
  return 
"<pre>" htmlspecialchars(_dump($value)) . "</pre>";
}
2024-11-06 16:02:12
http://php5.kiev.ua/manual/ru/function.var-export.html

    Поддержать сайт на родительском проекте КГБ