Bir dizeye var_dump sonucunu nasıl yakalayabilirim?


605

var_dumpBir dizgenin çıktısını yakalamak istiyorum .

PHP belgelerinde;

Sonuçlarını doğrudan tarayıcıya çıkaran herhangi bir şeyde olduğu gibi, çıktı kontrol işlevleri bu işlevin çıktısını yakalamak ve bir dizeye kaydetmek için kullanılabilir (örneğin).

Bunun nasıl çalışabileceğine bir örnek ne olurdu?

print_r() geçerli bir olasılık değil, çünkü bana ihtiyacım olan bilgiyi vermeyecek.

Yanıtlar:


601

Çıktı tamponlama kullanın:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>

8
Çıktı tamponlama kullanmanın büyük olasılıkla buradaki performans üzerinde olumsuz bir etkisi olacaktır. Karmaşık bir komut dosyasının yürütülmesi sırasında birden çok değişkene bakmanız gerekiyorsa da gerçekten dağınık olabilir.
selfawaresoup

83
@Inwdr Hiç var_dump hata ayıklama için kolaylık özelliği olarak kullandım ve kesinlikle var_dump deyimlerini üretim kodunda bırakmadım. Bunun tipik olduğunu düşünüyorum. Bu durumlarda, performansın hiç alakalı olması muhtemel değildir.
Mark Amery

ayrıca okunabilirlik için etiketleri kaldırın (yalnızca dizeyi istiyorsanız) strip_tags(), bu tür ve değeri döndürür.
Anıl

11
Bu, sorulan soruya iyi bir cevaptır, çünkü sorduğunuz gibi 'bir dizeye var_dump sonucunu elde edersiniz'. var_export () genel olarak daha mantıklı olduğu için ruhta daha iyi bir cevaptır.
Qaribou'dan Josh

1
@AlbertHendriks Ben var_dump tercih ederim. Xdebug etkinken güzel bir veri görüntüleme elde edersiniz.
robsch

880

Deneyin var_export

Kontrol etmek isteyebilirsiniz var_export- çıktısını yazdırmak yerine çıktısını döndürmesine neden olacak var_dumpikinci bir $returnparametre sağladığı gibi aynı çıktıyı sağlamaz :

$debug = var_export($my_var, true);

Neden?

Ben kullanmaya bu tek astar tercih ob_startve ob_get_clean(). Ayrıca, sadece PHP kodu olduğu için çıktıyı okumak biraz daha kolay.

Arasındaki fark var_dumpve var_exportolmasıdır var_exportdöner bir "değişkenin çözümlenebilir dize gösterimi" ise var_dumpsadece bir değişken hakkında bilgi döker. Bunun pratikte anlamı, var_exportgeçerli PHP kodu vermesidir (ancak özellikle kaynaklar ile çalışıyorsanız, değişken hakkında size çok fazla bilgi vermeyebilir ).

Demo:

$demo = array(
    "bool" => false,
    "int" => 1,
    "float" => 3.14,
    "string" => "hello world",
    "array" => array(),
    "object" => new stdClass(),
    "resource" => tmpfile(),
    "null" => null,
);

// var_export -- nice, one-liner
$debug_export = var_export($demo, true);

// var_dump
ob_start();
var_dump($demo);
$debug_dump = ob_get_clean();

// print_r -- included for completeness, though not recommended
$debug_printr = print_r($demo, true);

Çıktı farkı:

var_export ( $debug_exportyukarıdaki örnekte):

 array (
  'bool' => false,
  'int' => 1,
  'float' => 3.1400000000000001,
  'string' => 'hello world',
  'array' => 
  array (
  ),
  'object' => 
  stdClass::__set_state(array(
  )),
  'resource' => NULL, // Note that this resource pointer is now NULL
  'null' => NULL,
)

var_dump ( $debug_dumpyukarıdaki örnekte):

 array(8) {
  ["bool"]=>
  bool(false)
  ["int"]=>
  int(1)
  ["float"]=>
  float(3.14)
  ["string"]=>
  string(11) "hello world"
  ["array"]=>
  array(0) {
  }
  ["object"]=>
  object(stdClass)#1 (0) {
  }
  ["resource"]=>
  resource(4) of type (stream)
  ["null"]=>
  NULL
}

print_r ( $debug_printryukarıdaki örnekte):

Array
(
    [bool] => 
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
    [null] => 
)

Uyarı: var_exportdairesel referansları işlemez

Dairesel referansları olan bir değişkeni boşaltmaya çalışıyorsanız, arama var_exportPHP uyarısı ile sonuçlanır:

 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

Sonuçlar:

 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' => 
   array (
     'self' => NULL,
   ),
 )

Hem var_dumpve print_rdiğer taraftan, irade çıktı dize *RECURSION*dairesel referanslar karşılaştığında.


11
Bu kesinlikle kabul edilenden daha iyi bir cevaptır. Daha fazla oy vermediğine şaşırdım! Aradığı tüm bilgileri neden vermeyebileceğini açıklayabilir misiniz?
JMTyler

7
@JMTyler var_export döner bir ayrıştırılamaz dize esasen PHP kodu-ederken var_dump verilerin ham dökümü sağlar. Bu nedenle, örneğin, var_dump değerini 1 değerine sahip bir tamsayı olarak int(1)çağırırsanız, var_export yazdırılırken yazdırılır 1.
inxilpro

4
var_dump çalışırken $ GLOBALS ile kullanırsanız var_export karnına iner.
Olaf

3
kendisine referanslar içeren değişkenlerle çalışmaz .. var_export var_dump gibi çalışmaz; bunun gibi, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik

3
İnsanları düşünmeyi bırak . var_exporthata ayıklama için aslında daha iyi değil çünkü bir tarayıcı araması (int)veya (dize) `ve vb. için bir arama yapamadınız var_export(''); var_export('\'');. Ve en önemlisi, PHP için hazır olun Önemli hata: Yuvalama seviyesi çok derin - özyinelemeli bağımlılık? 75: C yolundaki C: \ path \ file.php
Pacerier

76

Bunu da yapabilirsiniz:

$dump = print_r($variable, true);

17
Ben özellikle var_dump söz :)
Mark Biek

7
Şahsen print_relimden geleni kullanmayı tercih ederim , ancak ne yazık ki bazen yeterli bilgi sağlamaz. Örneğin, dize nerede can, hem atmalarını beri falseve nullboş bir dize olarak göstermek. Bunlar arasındaki farkı önemsediğim durumlarda, begrudgingly var_dumpveya 'ya başvururdum var_export.
JMTyler


15
function return_var_dump(){
    // It works like var_dump, but it returns a string instead of printing it.
    $args = func_get_args(); // For <5.3.0 support ...
    ob_start();
    call_user_func_array('var_dump', $args);
    return ob_get_clean();
}

4
@MarkAmery Doğru görünüyor. Sadece kolaylaştırdım.
hanshenrik

13

Ayrıca yardımcı echo json_encode($dataobject);olabilir


1
Bu durumda, çıktı çok kafa karıştırıcı ve bence hata ayıklama amacından uzak.
Tomáš Zato - Monica'yı eski durumuna döndür

2
Mark Biek hata ayıklama hakkında bir şey söylemedi, değil mi? Belki de sadece DB'de kaydedilmiş nesneye ihtiyacı var. Bu durumda teklif ettiğim yöntem işe yarayacaktır. Yine de dikkatleri için teşekkürler, Tomáš Zato.
ZurabWeb

Her neyse, json_encodetüm verileri var_dumpiçermeyecektir (örneğin değişken türleri olarak). json_encodeaynı bilgiyi print_R, farklı formatta çıktılar .
Tomáš Zato - Monica'yı eski durumuna döndür

1
Tamam, bir kez daha açıklayacağım . OT, üretimine ihtiyaç duyduğunu belirtti var_dump. Ayrıca bunun print_Rihtiyaçları için yeterli bilgi sağlamadığını belirtti . Sağlanan bilgilerde gerçek bir fark yoktur json_encodeve print_r- sadece veri formatı farklıdır. Bu göz önüne alındığında, eğer print_ryetersizse, öyle de json_encode. Lütfen düşüş hakkında şikayet etmeyin. Açıkçası sadece rastgele bir tıklama değildi, bu yüzden onunla başa çık.
Tomáš Zato - Monica'yı eski durumuna döndür

9

PHP kılavuzundan :

Bu işlev, türünü ve değerini içeren bir veya daha fazla ifade hakkında yapılandırılmış bilgileri görüntüler.

Yani, aslında değişken uzunluklu bir argüman listesini kabul eden PHP'nin gerçek dönüş versiyonu var_dump():

function var_dump_str()
{
    $argc = func_num_args();
    $argv = func_get_args();

    if ($argc > 0) {
        ob_start();
        call_user_func_array('var_dump', $argv);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }

    return '';
}

1
Asıl soruya Gerçek Cevap vermek için +1. Bunu var_dump, var_export, print_r, serialize, json_encode veya gerçek bir hata ayıklayıcıya ihtiyacım olduğu için okuyorum. Bunları nasıl kullanacağımı da biliyorum. OP var_dump istedi, ben var_dump gerekir. Teşekkür ederim!
Slashback

var_dump için doğru kalmak istiyorsanız, trigger_error ("var_dump_str ()" için yanlış parametre sayısı) gerekir; argc <= 0 olduğunda; ya da daha iyisi, var_dump sizin için yapsın. : p
hanshenrik

Bu, kabul edilen cevapta bulunmayan hemen hemen hiçbir şey eklemez. $argcBuradaki onay gereksiz ve @hanshenrik tarafından sivri out gibi tartışmalı yanlış ve burnunuzu bu kazandıktan sonra söz gerçekten ekliyoruz hepsi call_user_func_arrayve func_get_argsaramaları.
Mark Amery

5

Çalışma zamanında bir değişkenin içeriğine bakmak isterseniz, XDebug gibi gerçek bir hata ayıklayıcı kullanmayı düşünün. Bu şekilde kaynak kodunuzu karıştırmanıza gerek kalmaz ve normal kullanıcılar uygulamanızı ziyaret ederken bile bir hata ayıklayıcı kullanabilirsiniz. Fark etmeyecekler.


5

İşte bir fonksiyon olarak komple çözüm:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

2
1'den fazla değişkenle çalışmaz ... var_dump ("foo", "bar") => dize (3) "foo" dize (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik

2

Bu biraz konu dışı olabilir.

Ben PHP-FPM konteyner Docker günlüğüne bu tür bilgileri yazmak için bir yol arıyordum ve aşağıdaki snippet ile geldi. Bunun Docker PHP-FPM kullanıcıları tarafından kullanılabileceğinden eminim.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));

1
tanıtıcı asla kapatılmaz, bu nedenle bu, uzun süredir çalışan daemon tarzı komut dosyalarında sorun olabilecek bir kaynak sızıntısıdır. ama deneyinfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik

0

Gerçekten gibi var_dump()'çıkışı ayrıntılı s ve memnun değildi var_export()' ler veya print_r()çok bilgi olarak vermediğinden (uzunluk eksik, örneğin veri türü eksik) 'nın çıkışı.

Güvenli ve öngörülebilir bir kod yazmak için, bazen boş bir dize ile bir boş arasında ayrım yapmak yararlı olabilir. Veya 1 ile doğru arasında. Veya null ile false arasında. Veri türümü çıktıda istiyorum.

Her ne kadar yararlı olsa var_dump()da, html etiketleri olmadan ve tüm detayları dahil olmak üzere insan tarafından okunabilir bir çıktıya renkli bir çıktıya dönüştürmek için mevcut yanıtlarda temiz ve basit bir çözüm bulamadım var_dump().

Eğer bir renkli var_dump()varsa, php varsayılan var_dump()html renkleri eklemek için geçersiz kılan Xdebug yüklü anlamına gelir .

Bu nedenle, tam olarak ihtiyacım olanı veren bu hafif varyasyonu yarattım:

function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

Aşağıdaki güzel dizeyi döndürür:

array (size=6)
  'functioncall' => string 'add-time-property' (length=17)
  'listingid' => string '57' (length=2)
  'weekday' => string '0' (length=1)
  'starttime' => string '00:00' (length=5)
  'endtime' => string '00:00' (length=5)
  'price' => string '' (length=0)

Umarım birine yardımcı olur.


-2

Gönderen http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html :

var_dump ve print_r işlevleri yalnızca doğrudan tarayıcıya gönderilebilir. Böylece bu fonksiyonların çıktıları sadece php'nin çıktı kontrol fonksiyonları kullanılarak alınabilir. Çıktıyı kaydetmek için aşağıdaki yöntem yararlı olabilir.

function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

ob_get_clean () yalnızca dahili arabelleğe girilen son verileri temizleyebilir. Bu nedenle, birden fazla girişiniz varsa ob_get_contents yöntemi yararlı olacaktır.

Yukarıdaki ile aynı kaynaktan:

function varDumpToErrorLog( $var=null ){
    ob_start();                    // start reading the internal buffer
    var_dump( $var);          
    $grabbed_information = ob_get_contents(); // assigning the internal buffer contents to variable
    ob_end_clean();                // clearing the internal buffer.
    error_log( $grabbed_information);        // saving the information to error_log
}

1
Lütfen başka bir kaynaktan materyal alıntılarken uygun şekilde belirtin. Ben marka üzereyim düzenleme öncesinde bir alıntı olarak biçimlendirilmiş bu cevabın sadece bir parçası sen parçasıdır vermedi birilerinin blogdan kopyalayıp yapıştırın.
Mark Amery

-2

Uzun dize : echo($var);yerine kullanın dump($var);.

Nesne veya Dizi :var_dump('<pre>'.json_encode($var).'</pre>);'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.