【问题标题】:PHP is_object() seems not work properlyPHP is_object() 似乎无法正常工作
【发布时间】:2016-12-26 15:21:35
【问题描述】:

我有:

<?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 是一个数组时,它会按预期打印数组值,但会引发一个通知:"array to string conversion on line 8"。当 $var($b['args']) 内有对象时,它会引发致命错误:"Object of class __PHP_Incomplete_Class could not be converted to string on line 8".

我认为,问题不是“__PHP_Incomplete_Class”,而是“无法在第 8 行转换为字符串”,因为我已经在做 "if(!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
                    )

            )

    )

【问题讨论】:

  • 你能给我们一个$var的例子以便测试它吗?
  • 通知只是为了提高认识。它对您的代码是非阻塞的,并且将在生产服务器上被禁用。在对象上,您应该使用get_class() 函数来显示其名称。
  • 给我们完整的错误信息并告诉我们它指的是哪一行。确定echo $k.' =&gt; '.$v 不会引发该错误……‽
  • @deceze 绝对确定,因为它指向发生错误的行。
  • 我在blog post 上读到,在声明类之前使用session_start 时可能会遇到类似问题。你在做这样的事情吗?

标签: php arrays object recursion printing


【解决方案1】:

我在一位开发人员的提示下实现了解决方案。

我认为问题出在“is_object()”函数是正确的。

实际上,在某些情况下,当 $var 数据类型可以是对象,但 is_object() 返回 false。当对象不可序列化时会发生这种情况。

所以我解决了变化:

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

为:

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

所以异常消失了,脚本可以继续。

关于“is_object()” php 函数的一个简单但未知且烦人的细节。

希望它可以帮助那些因 is_object() 这个令人困惑的事情而遇到麻烦的人。

【讨论】:

    【解决方案2】:

    无论这是一个数组还是一个对象,您的代码都试图回显存在的每个键/值的键和值。由于这是一个多维数组,您无法为每个值都使用echo $v。

    您可以尝试print_r 或var_dump:

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

    在此处查看有关如何打印数组的更多信息:How to echo an array in PHP?

    【讨论】:

    • 对于他的问题,即使是var_dump或者print_r也应该能排除类不完整的错误吧?
    • 这是一个数组,不知道他为什么要把它转换成一个对象
    • @Dan 我更正了示例代码。对于 $v 是数组或对象的情况,它有一个递归。
    • @Dan 我的意思是我将这篇文章中的示例代码更正为与原始代码相似。
    猜你喜欢
    • 2015-12-03
    • 2015-04-06
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    相关资源
    最近更新 更多