Ne PHP fonksiyon içeriği ile bir dizi ismini basacaktır?

5 Cevap

Perl'de Smart'ın :: Yorumlar kullandığınızda, ben (aşağıda yani% kişiyi) damping am karma adını görebilirsiniz. . .

[pdurbin@macbook ~]$ cat /tmp/person.pl
#!/usr/bin/perl
use strict;
use warnings;
use Smart::Comments;
my %person = (
    'hair' => 'golden',
    'eyes' => 'blue',
);
### %person
[pdurbin@macbook ~]$ perl /tmp/person.pl

### %person: {
###            eyes => 'blue',
###            hair => 'golden'
###          }
[pdurbin@macbook ~]$

. . . ama PHP sadece "Array", $ kişi hiçbir söz bkz. . .

[pdurbin@macbook ~]$ cat /tmp/person.php 
<?php
$person = array(
    'hair' => 'golden',
    'eyes' => 'blue',
);
print_r($person);
[pdurbin@macbook ~]$ php /tmp/person.php
Array
(
    [hair] => golden
    [eyes] => blue
)
[pdurbin@macbook ~]$

Ben, print_r() çalıştı var_export(), ve var_dump() ama onun içeriği ile bir dizi adını yazdırmak bazı diğer PHP işlevi var mı?

5 Cevap

Aslında, bu mümkün, ama son derece hackish şekilde bulunmaktadır. Sen debug_backtrace() to get the number of the line (and the filename, of course) where the running function was called from. This allows you to parse that line to find out the expression (e.g. $myArray)) ({[(2 örneğin)]} değerlendirilir ve çalışan işlevine geçirildi hangi kullanabilirsiniz. Ancak, ifade Tokenizer gibi karmaşık çözümlerini kullanmadan başlar ve nerede biter bulmak kolay değildir.

getArgumentExpressionAsString() zaten uygulanmakta olduğunu varsayarsak, "damping" fonksiyonu aşağıdaki gibi olacaktır:

function dump($arg)
{
    $backtrace = debug_backtrace();
    $expression = getArgumentExpressionAsString($backtrace[0]);
    echo "$expression:";
    var_dump($arg);
}

EDIT. Bir örnek uygulama:

function getArgumentExpressionAsString($backtrace)
{
    $allLines = file($backtrace['file']);
    $line =  $allLines[$backtrace['line'] - 1];
    $function = $backtrace['function'];
    return preg_replace("/.*{$function}\((.*)\).*/", '$1', $line);
}

function dump($arg)
{
    $backtrace = debug_backtrace();
    $expression = getArgumentExpressionAsString($backtrace[0]);
    echo "$expression:\r\n";
    var_dump($arg);
}

$arr = array(1, 2, 3);

dump($arr);

Çıktı olacaktır:

$arr:array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

PHP bir değişken adı, gerçek diziye sadece bir referanstır. Aynı diziyi ifade birden çok değişken olabilir. Yani bir dizinin the adını bulmak mümkün değildir.

You will have to print the name of the variable separately, unfortunately. You could wrap this in your own function to make it easier:

function print_r_WithName($varName,$return=FALSE){
  $retVal='';
  if(!$return){
    print "$varName:";
  }
  else{
    $retVal=$varName.':';
  }

  $retval.=print_r($$varName,$return);

  return $retVal
}

ve sonra da onu aramak

print_r_WithName("person");

//output:
person:Array
(
  [hair] => golden
  [eyes] => blue
)

JW zaten işaret olarak, PHP (JavaScript gibi sadece son zamanlarda öğrendim gibi) var_dump tarafından erişilebilir dizinin içindeki veri geçer, o referans ismi geçmez. Dil yapılandırılmıştır gibi bu işleve bir başvuru geçirmeden adını bilmek için bir yol gerçekten orada değil. Içindeki verileri ona kaç tane başvuru farkında, ama (herhangi bir prototip dahil ve bu ayrıştırma sırasında perde arkasında gider inşa), istediğiniz hangisi bilmenin bir yolu vardır.

Ancak, burada ben bu bilgileri almak için (baskı altında) kullandığı bir godawful HACK olduğunu.

function AwesomeDump($data, $reference=null)
   {
   $myreturn = "";
   if ($reference) { $myreturn = $reference;}
   $myreturn .= var_dump($data);
   return $myreturn;
   }

Bunu çalıştırmak için bu durumda, size sahip olmak istediğiniz HANGİ adını belirtmek için ikinci argüman olarak referans adını vermeniz gerekir. Bu varsayılan siz aksini belirtmedikçe bu yüzden sadece benim var_dump çalışır null.

Sen yapamazsın, PHP bu Smart'ın :: Yorumlar diye bir şey yoktur.

Eğer değişken değerlerini izlemek istiyorsanız, o zaman xdebug gibi, bir hata ayıklayıcı kullanmalısınız