php
  • arrays
  • object
  • recursion
  • printing
  • 2016-12-26 134 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是一个数组或对象。 –

    相关问题