php echo Catchable致命错误:类的对象...无法转换为字符串

时间:2012-06-14 09:34:45

标签: php echo

我在尝试显示某个变量时收到了错误:

echo "id is $url->model->id";

问题似乎是echo只喜欢以这种方式显示的简单变量(如$ id或$ obj-> id)。

class url {
    public function  __construct($url_path) {
        $this->model = new url_model($url_path);
    }
}

class url_model {
    public function  __construct($url_path) {
        $this->id = 1;
    }
}

然后

$url = new url();
echo "id is $url->model->id"; // does not work

$t = $url->model->id;
echo "id is $t";  //works

$t = $url->model;
echo "id is $t->id";  //works

echo "id is {$url->model->id}"; //works. This is the same syntax used to display array elements in php manual.

//php manual example for arrays
echo "this is {$baz['value']}";

我不知道它为什么会起作用,我只是猜到了语法。

在php手册中,它没有说明如何使用echo "..."来表示对象。还有一些奇怪的行为:回声简单的变量,作品;回显对象的简单属性;对另一个对象内的对象的简单属性的回显不起作用。

这是echo "id is {$url->model->id}";正确的方法吗?有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

"{$var}"是通用字符串变量插值语法。对于像一维数组这样的东西有一些syntax shortcuts known as simple syntax

echo "$arr[foo]";

这对于多维数组不起作用,例如, "$arr[foo][bar]"。它只是一个硬编码的特殊情况。对象也是如此。 "$obj->foo"是一个有效的硬编码特例,而complex "{$obj->foo->bar}" syntax则需要处理更复杂的案例。

答案 1 :(得分:0)

更新:

也许我错了,回复$url->model$url->model->id只会尝试将其转换为字符串并返回它以便您可以执行此操作,但您必须在模型中使用__toString函数< / p>

我做了一个例子来澄清我的观点:     

class url {
    public function  __construct($url_path) {
        $this->model = new url_model($url_path);
    }
}

class url_model {
    public function  __construct($url_path) {
        $this->id = 1;
    }

    public function __toString()
    {
        return (string) $this->id ; 
    }
}

$url = new url("1");
echo "id is $url->model->id"; // it will  convert $url->model to "1" , so the string will be 1->id
echo "id is $url->model"; // this will  work now too 
$t = $url->model->id;
echo "id is $t";  //works
$t = $url->model;
echo "id is $t->id";  //works
echo "id is {$url->model->id}"; //works. This is the same syntax used to display array elements in php manual

但我不确定echo "this is {$baz['value']}";是什么?

检查__toString以获取有关魔术方法的更多信息

但我宁愿坚持{$url->model->id}