【发布时间】: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.' => '.$v不会引发该错误……‽ -
@deceze 绝对确定,因为它指向发生错误的行。
-
我在blog post 上读到,在声明类之前使用
session_start时可能会遇到类似问题。你在做这样的事情吗?
标签: php arrays object recursion printing