php
  • arrays
  • object
  • recursion
  • printing
  • 2016-12-26 132 views 0 likes 
    0

    我:PHP is_object()似乎不正常工作

    <?php 
    
    function _dump($var, $name = "", $return = false){ 
        $output = "<div>"; 
        if (!is_array($var) && !is_object($var)) { 
         $output .= 'Var name: '.$name.'<br>'; 
         $output .= 'Type: '.gettype($var).'<br>'; 
         $output .= 'Length: '. strlen((string) $var).'<br>'; 
         $output .= 'Value: '.$var.'<br>'; 
        } else{ 
         $output .= 'Var '.$name.' is an '.gettype($var). 
         ' with length '.count((array) $var). 
         ' and the values is listed bellow:<br>'; 
    
         foreach($var as $k => $v){ 
          $output .= '<div style="margin-left:10px;">'. 
          _dump($v, $k, true).'</div>'; 
         } 
        } 
    
        $output .= "</div>"; 
    
        if($return) 
         return $output; 
        else echo $output; 
    } 
    
    
    $backtrace = debug_backtrace(); 
    foreach($backtrace as $b){ 
        _dump($b['args'], "Args"); 
        echo '<hr>'; 
    } 
    ?> 
    

    是$ var是它打印預期數組值的數組,但提出了一個通知:「數組就行字符串轉換8「。並且當在$ var($ b ['args'])中存在它引發的對象致命錯誤:「類__PHP_Incomplete_Class的對象無法轉換爲第8行的字符串」

    的問題,我想,是不是「__PHP_Incomplete_Class」的事情,但「不能轉換爲字符串上線8」,因爲我已經做了「如果(!is_array()& &!is_object() )「。所以,如果我正在檢查它,爲什麼會提高通知和錯誤?

    任何想法?

    這是debug_bactrace()所引發異常的確切迭代:

    Array 
        (
         [file] => /home/gabriel/Projects/realinvest/engine/class.system.php 
         [line] => 93 
         [function] => call_user_func_array 
         [args] => Array 
          (
           [0] => Array 
            (
             [0] => __PHP_Incomplete_Class Object 
              (
               [__PHP_Incomplete_Class_Name] => Procedures 
               [system:protected] => System Object 
                (
                 [controller:protected] => users 
                 [method:protected] => register 
                 [args:protected] => Array 
                  (
                   [0] => 1 
                  ) 
    
                 [cpath:protected] => /var/www/html/realinvest//controllers/ 
                ) 
    
               [module:Controller:private] => procedures 
               [method:Controller:private] => register 
               [model:protected] => __PHP_Incomplete_Class Object 
                (
                 [__PHP_Incomplete_Class_Name] => ModelProcedures 
                 [primarykey:Model:private] => id 
                 [table:Model:private] => procedures 
                 [dbclass:protected] => __PHP_Incomplete_Class Object 
                  (
                   [__PHP_Incomplete_Class_Name] => Dbclass 
                   [dbhost:Dbclass:private] => localhost 
                   [dbname:Dbclass:private] => processos_real 
                   [dbuser:Dbclass:private] => root 
                   [dbpass:Dbclass:private] => h7t846m2 
                   [dbtype:Dbclass:private] => mysql 
                   [cnnInfo:Dbclass:private] => stdClass Object 
                    (
                     [info] => No connection info. 
                    ) 
    
                   [connection:Dbclass:private] => 
                   [queryerror] => 
                   [datatypes:Dbclass:private] => Array 
                    (
                     [boolean] => 5 
                     [integer] => 1 
                     [double] => 2 
                     [string] => 2 
                     [resource] => 3 
                    ) 
    
                   [transaction_mode:Dbclass:private] => 
                   [lastresult:Dbclass:private] => 
                   [error] => 0 
                  ) 
    
                 [sql:protected] => __PHP_Incomplete_Class Object 
                  (
                   [__PHP_Incomplete_Class_Name] => Sql 
                   [table:Sql:private] => procedures 
                   [sqlstring:Sql:private] => SELECT * FROM `procedures` WHERE procedures.`id`= ? 
                   [sqlvalues:Sql:private] => Array 
                    (
                     [id] => 1 
                    ) 
    
                  ) 
    
                ) 
    
              ) 
    
             [1] => register 
            ) 
    
           [1] => Array 
            (
             [0] => 1 
            ) 
    
          ) 
    
        ) 
    
    +3

    你能舉一個'$ var'的例子來測試它嗎? – AnthonyB

    +0

    通知只是爲了提高認識。它對您的代碼是非阻塞的,並且將在生產服務器上禁用。在對象上,你應該使用[''get_class()''](https://secure.php.net/manual/fr/function.get-class.php)函數來顯示它的名字。 –

    +0

    給我們完整的錯誤信息,並告訴我們它指的是哪一行。確定'echo $ k。' =>'。$ v'不會引發那個錯誤......‽ – deceze

    回答

    2

    我意識到從老鄉開發了一絲解決方案。

    我認爲問題是「is_object()」函數是正確的。

    實際上,有些情況下,$ var datatype可以是一個對象,但is_object()返回false。它發生在對象不可序列化時。

    所以我解決了改變:

    if(!is_array($var) && !is_object($var)){... 
    

    爲:

    if(!is_array($var) && gettype($var) !== "object"){... 
    

    所以異常消失,腳本可以繼續下去。

    關於「is_object()」php函數的一個簡單但未知的煩人的細節。

    希望它可以幫助那些正在面臨這個關於is_object()這個令人困惑的事情的麻煩的人。

    1

    這是否是一個數組或對象,你的代碼試圖呼應鍵和值的foreach鍵/值存在。由於這是一個多維數組,因此您無法爲每個值設置echo $v

    相反,你可以嘗試print_rvar_dump

    foreach((array) $var as $k => $v){ 
        echo $k.' => '.print_r($v); 
    } 
    

    查看更多關於這裏如何打印數組:How to echo an array in PHP?

    +0

    有了他的問題,即使var_dump或print_r應該dis ^可能關於不完整的類的錯誤,不是? – AnthonyB

    +0

    這是一個數組,不知道他爲什麼要將它轉換爲對象 – Dan

    +0

    @Dan我更正了示例代碼。它具有遞歸的情況$ v是一個數組或對象。 –

    相關問題