Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Informacje o zmiennej, Funkcja wyświetlająca informacje o zmiennej
shinuexx
post 25.03.2011, 12:45:24
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


Witam
Napisałem sobie prostą funkcję do wyświetlania informacji o zmiennej, połączenie print_f() i var_dump().
Funkcja w tagu <pre> wyświetlana jest podobnie do print_f(). Zamieszczam poniżej kod, może komuś się przyda.
  1. <?php
  2. //funkcje pomocnicze
  3. function boolname($int)
  4. {
  5. switch($int){
  6. case 0:
  7. return 'false';
  8. break;
  9. case 1:
  10. return 'true';
  11. break;
  12. }
  13. }
  14. function level($lev, $roach)
  15. {
  16. $tab="";
  17. for($x=0;$x<$lev;$x++)
  18. {
  19. $tab.=$roach;
  20. }
  21. return $tab;
  22. }
  23.  
  24. // Drukowanie informacji o zmiennej
  25.  
  26. function print_var($var, $lev=0, $arname=1, $roach="\t",$inside=false)
  27. {
  28. $level=level($lev,$roach);
  29. if(!isset($var))
  30. {
  31. echo 'Undefined variable';
  32. }
  33. else if(!is_array($var))
  34. {
  35. if (is_string($var))
  36. {
  37. echo "string[".strlen($var)."](\"".$var."\")";
  38. }
  39. else if(is_integer($var))
  40. {
  41. echo "integer(".$var.")";
  42. }
  43. else if (is_bool($var))
  44. {
  45. echo "boolean(".boolname($var).")";
  46. }
  47. else if (is_resource($var))
  48. {
  49. echo "resource(".get_resource_type($var).")";
  50. }
  51. else if (is_float($var))
  52. {
  53. echo "float(".$var.")";
  54. }
  55. else if (is_object($var))
  56. {
  57. $type=new ReflectionClass($var);
  58. echo "object[\"".$type->getName()."\"]\n";
  59. echo $level.$roach."(";
  60. print_var((array)$var, $lev+1,0,$roach,true);
  61. }
  62. else if (is_null($var))
  63. {
  64. echo "void[NULL]\n";
  65. }
  66. else
  67. {
  68. echo('Unknown variable');
  69. }
  70. }
  71. else
  72. {
  73. if ($inside==false){echo$level;};
  74. if ($arname==1){echo "array\n".$level."(";}
  75. $keys=array_keys($var);
  76. for($x=0; $x<count($keys); $x++)
  77. {
  78.  
  79. if(is_array($var[$keys[$x]]))
  80. {
  81. echo "\r\n";
  82. echo $level.$roach;
  83. echo "[".$keys[$x]."] => ";
  84. print_var($var[$keys[$x]],$lev+1,1,$roach,true);
  85. }
  86. else if (is_string($var[$keys[$x]]))
  87. {
  88. echo "\r\n";
  89. echo $level.$roach;
  90. echo "[".$keys[$x]."] => string[".strlen($var[$keys[$x]])."](\"".$var[$keys[$x]]."\")";
  91. }
  92. else if (is_integer($var[$keys[$x]]))
  93. {
  94. echo "\r\n";
  95. echo $level.$roach;
  96. echo "[".$keys[$x]."] => integer(".$var[$keys[$x]].")";
  97. }
  98. else if (is_bool($var[$keys[$x]]))
  99. {
  100. echo "\r\n";
  101. echo $level.$roach;
  102. echo "[".$keys[$x]."] => boolean(".boolname($var[$keys[$x]]).")";
  103. }
  104. else if (is_resource($var[$keys[$x]]))
  105. {
  106. echo "\r\n";
  107. echo $level.$roach;
  108. echo "[".$keys[$x]."] => resource(".get_resource_type($var[$keys[$x]]).")";
  109. }
  110. else if (is_float($var[$keys[$x]]))
  111. {
  112. echo "\r\n";
  113. echo $level.$roach;
  114. echo "[".$keys[$x]."] => float(".$var[$keys[$x]].")";
  115. }
  116. else if (is_object($var[$keys[$x]]))
  117. {
  118. echo "\r\n";
  119. echo $level.$roach;
  120. $type=new ReflectionClass($var[$keys[$x]]);
  121. echo "[".$keys[$x]."] => object[\"".$type->getName()."\"]\n";
  122. echo $level.$roach."(";
  123. print_var((array)$var[$keys[$x]], $lev+1,0,$roach,true);
  124. }
  125. else if (is_null($var[$keys[$x]]))
  126. {
  127. echo "\r\n";
  128. echo $level.$roach;
  129. echo "[".$keys[$x]."] => void[NULL]\n";
  130. }
  131. };
  132. echo "\r\n".$level.")";
  133. }
  134. }
  135. ?>


Struktura funkcji wygląda następująco:
Kod
void print_var(mixed $variable,[int $level=0,[int $arname=1,[string $roach="\t",[bool $inside=false]]]])

gdzie:
$variable - zmienna którą przetwarzamy;
$level - poziom wcięcia, przydatne przy tablicach żeby wartości tablic zagnieżdżonych były wyświetlone z wcięciem;
$arname - czy wyświetlić ''array\n" na początku w przypadku gdy zmienna jest tablicą, standardowo tak;
$roach - czy ma być wykonane wcięcie, standardowo tabulator;
$inside - używane wewnątrz funkcji do rekurencji, aby prawidłowo wyświetlało wcięcia;

Funkcję najlepiej wyświetlać poprzez tag <pre> żeby zwiększyć czytelność tak jak to ma miejsce przy print_r(). Gdy wywołamy funkcję w postaci:
  1. @print_var($var);

i $var nie będzie zdefiniowane, funkcja wyświetli informację o tym.

Przykład użycia dla następującego kodu
  1. $obj = new stdClass();
  2. $obj->student=array("test","tfds","dsfew");
  3.  
  4. $fp=fopen("test.txt","r");
  5.  
  6. $my=mysql_connect("127.0.0.1","root","password");
  7.  
  8. $test=array($fp,'test'=>45,'ttds'=>'fdsfd',34,'5342',array(array('fds'=>$my,456),'11'=>3.25,'elo'=>0xff,array( array(array($obj))),'teggd'),true,);

Kod
array
(
    [0] => resource(stream)
    [test] => integer(45)
    [ttds] => string[5]("fdsfd")
    [1] => integer(34)
    [2] => string[4]("5342")
    [3] => array
    (
        [0] => array
        (
            [fds] => resource(mysql link)
            [0] => integer(456)
        )
        [11] => float(3.25)
        [elo] => integer(255)
        [12] => array
        (
            [0] => array
            (
                [0] => array
                (
                    [0] => object["stdClass"]
                    (
                        [student] => array
                        (
                            [0] => string[4]("test")
                            [1] => string[4]("tfds")
                            [2] => string[5]("dsfew")
                        )
                    )
                )
            )
        )
        [13] => string[5]("teggd")
    )
    [4] => boolean(true)
)


Ten post edytował shinuexx 25.03.2011, 12:53:59
Go to the top of the page
+Quote Post
Crozin
post 25.03.2011, 12:58:08
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tylko po co coś takiego skoro zwykły var_dump() z xdebugiem daje dużo lepszy rezultat: http://jsfiddle.net/w8wHf/
Go to the top of the page
+Quote Post
wookieb
post 25.03.2011, 13:00:58
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




level -> str_repeat

A wyświetl teraz to...
  1. $obj = new stdClass();
  2. $obj->student=array("test","tfds","dsfew");
  3. $obj->test = $obj;

Hym?


--------------------
Go to the top of the page
+Quote Post
shinuexx
post 25.03.2011, 16:07:39
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


Dzięki za tego str_repeat 'a w sumie łatwiej;P o zmiennej rekurencyjnej to nie pomyślałem. Zobaczę co uda mi się wytworzyć żeby tą funkcję zabezpieczyć przed rekurencją nieskończoną rekurencją.
Go to the top of the page
+Quote Post
Spirit86
post 26.03.2011, 14:41:55
Post #5





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Nie podoba mi się ten kod. Zoptymalizuj go trochę. Przykład:

  1. function boolname($int){
  2. return $int; // nie wiem po co Ci taka funkcja tongue.gif
  3. }


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 15:00:39
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Po co to wszystko pisać, skoro mamy całą rodzinę metod assertXXX w pakiecie PHPUnit questionmark.gif


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
wookieb
post 26.03.2011, 15:36:27
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A ty wiesz co czego służy assert?


--------------------
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 15:38:42
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


A ja wiem, do czego służy assert.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Crozin
post 26.03.2011, 15:41:34
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Chyba nie skoro uważasz, że astertXXX z PHPUnit zwróci mi czytelną reprezentację wartości zmiennej.
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 15:51:08
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 26.03.2011, 15:41:34 ) *
Chyba nie skoro uważasz, że astertXXX z PHPUnit zwróci mi czytelną reprezentację wartości zmiennej.

A gdzie ja tak napisałem? Przy użyciu tych metod można byłoby zaoszczędzić sporo kodu, który tutaj sprawdza np. typ zmiennej w - moim zdaniem - mało elegancki sposób za pomocą dziesiątek par instrukcji warunkowych if -elseif etc. Po prostu nie podoba mi się zaprezentowane przez autora rozwiązanie, jest to moja prywatna opinia i tyle w temacie. Proszę czytać uważnie i nie dopowiadać sobie czegoś, czego nie napisałem. Poza tym w ogóle jest sens pisania czegoś takiego, nie lepiej, łatwiej, szybciej odpalić widok php debug i debugować?


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
wookieb
post 26.03.2011, 15:52:24
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




To może tak.
Powiedz do czego służy assert i jaki to ma związek z tematem?


--------------------
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 16:05:12
Post #12





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


To jakaś prowokacja czy o co chodzi? Dlaczego niby nie można byłoby wykorzystać metod do diagnostyki typu zmiennej i na podstawie wyniku aserci zwracać rzeczywisty typ zmiennej? Może czegoś nie wiem, w phpunit dopiero raczkuję, proszę mnie poprawić jeśli się mylę.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
wookieb
post 26.03.2011, 16:06:50
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No właśnie...
Asercje służą do wykonywania porównań wartości w testach jednostkowych. I nie służą do diagnostyki w normalnych aplikacjach lecz tylko do testów jednostkowych.


--------------------
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 16:08:17
Post #14





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Ok, to wiemy, ale dlaczego nie można oprzeć takiej klasy w sumie diagnostycznej o pakiet do testów jednostkowych? Za ciężkie to będzie, o to chodzi tylko?


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
wookieb
post 26.03.2011, 16:10:31
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




To co autor prezentuje to sposób wyświetlania wartości zmiennej. Bardzo nad wyrost bo naprawdę var_dump i print_r są do tego celu bardzo dobre.
Poza tym asercje są za ciężkie. Za każdym razem tworzą nowy obiekt a robią to samo co możesz zrobić jedną prostą operacją logicznę
Kod
assertTrue  wartosc === true
assertFalse wartosc === false
assertEquals wartosc == inna_wartosc



--------------------
Go to the top of the page
+Quote Post
darko
post 26.03.2011, 16:12:27
Post #16





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


I o to chodziło, dzięki. wookieb++


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
shinuexx
post 28.03.2011, 15:35:13
Post #17





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


Poprawiłem trochę ten kod i wygląda on teraz następująco:
  1. function print_var($var, $lev=0, $arname=1, $roach="\t", $inside=false)
  2. {
  3. $level=str_repeat($roach,$lev);
  4. switch(gettype($var))
  5. {
  6. case 'string':
  7. echo "string[".strlen($var)."](\"".$var."\")";
  8. break;
  9. case 'integer':
  10. echo "integer(".$var.")";
  11. break;
  12. case 'boolean':
  13. echo "boolean(";
  14. switch($var){
  15. case 0:
  16. echo 'false';
  17. break;
  18. case 1:
  19. echo 'true';
  20. break;
  21. }
  22. echo ")";
  23. break;
  24. case 'resource':
  25. $info=substr((string)$var,strpos((string)$var,"#")+1);
  26. echo "resource[".$info."](".get_resource_type($var).")";
  27. break;
  28. case 'double':
  29. echo "float(".$var.")";
  30. break;
  31. case 'object':
  32. $type=new ReflectionClass($var);
  33. echo "object[\"".$type->getName()."\"]\n";
  34. echo $level.$roach."(";
  35. print_var((array)$var, $lev+1,0, $roach, true);
  36. break;
  37. case 'NULL':
  38. echo "void[NULL]\n";
  39. break;
  40. case 'array':
  41. if ($inside==false){echo $level;};
  42. if ($arname==1){echo "array\n".$level."(";};
  43. $keys=array_keys($var);
  44. for($x=0; $x<count($keys); $x++)
  45. {
  46. echo "\r\n";
  47. echo $level.$roach;
  48. echo "[".$keys[$x]."] => ";
  49. switch(gettype($var[$keys[$x]]))
  50. {
  51. case 'object':
  52. $type=new ReflectionClass($var[$keys[$x]]);
  53. if ((array)$var==(array)$var[$keys[$x]])
  54. {
  55. echo "object[*RECURSION*]";
  56. }
  57. else if (in_array((array)$var,(array)$var[$keys[$x]]))
  58. {
  59. echo "object[*RECURSION*]";
  60. }
  61. else
  62. {
  63. echo "object[\"".$type->getName()."\"]\n";
  64. echo $level.$roach."(";
  65. print_var((array)$var[$keys[$x]], $lev+1,0,$roach,true);
  66. }
  67. break;
  68. default:
  69. print_var($var[$keys[$x]], $lev+1,0,$roach,true);
  70. break;
  71. };
  72. };
  73. echo "\r\n".$level.")";
  74. break;
  75. };
  76. switch($inside)
  77. {
  78. case true:
  79. break;
  80. case false:
  81. echo "\r\n";
  82. break;
  83. };
  84. };
  85. ?>

Działa na rekurencji 1 i 2 poziomie rekurencji na obiektach. Dalej jeszcze nie udało mi się dość. A na tablicach to wogóle. Tzn:
  1. $obj = new stdClass();
  2. $obj->student=array("test","tfds","dsfew");
  3. $obj->test = $obj;
  4. $obj->test2 = array('test'=>$obj,1,3,4,"12");

z tym sobie radzi:
Kod
object["stdClass"]
    (
        [student] =>
            [0] => string[4]("test")
            [1] => string[4]("tfds")
            [2] => string[5]("dsfew")
        )
        [test] => object[*RECURSION*]
        [test2] =>
            [test] => object[*RECURSION*]
            [0] => integer(1)
            [1] => integer(3)
            [2] => integer(4)
            [3] => string[2]("12")
        )
    )

natomiast z tym już nie:
  1. $obj = new stdClass();
  2. $obj->student=array("test","tfds","dsfew");
  3. $obj->test = $obj;
  4. $obj->test2 = array('test'=>array($obj),1,3,4,"12");
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 02:07