PHP 5.1.6 魔术方法__toString的含义是什么?

5
在CodeIgniter中,我正在尝试使用this插件,它要求我在我的模型中实现toString方法。我的toString方法只是简单地执行以下操作:
public function __toString()
{
    return (string)$this->name;
}

在我的本地机器上,使用 PHP 5.3 一切正常,但是在 PHP 5.1.6 的生产服务器上,它显示“Object id#48”,而该对象的名称属性值应该出现...... 我找到了关于 问题 的一些内容,但我仍然不理解... 我该如何修复这个问题?

你尝试过使用return (string)$this->name吗? - Galen
5个回答

7
class YourClass 
{
    public function __toString()
    {
        return $this->name;
    }
}

PHP < 5.2.0

$yourObject = new YourClass();
echo $yourObject; // this works
printf("%s", $yourObject); // this does not call __toString()
echo 'Hello ' . $yourObject; // this does not call __toString()
echo 'Hello ' . $yourObject->__toString(); // this works
echo (string)$yourObject; // this does not call __toString()

PHP >= 5.2.0

$yourObject = new YourClass();
echo $yourObject; // this works
printf("%s", $yourObject); // this works
echo 'Hello ' . $yourObject; // this works
echo 'Hello ' . $yourObject->__toString(); // this works
echo (string)$yourObject; // this works

3
从手册中摘录:
值得注意的是,在 PHP 5.2.0 之前,__toString 方法只有在与 echo() 或 print() 直接组合时才会调用。自从 PHP 5.2.0 以来,在任何字符串上下文中都会调用它(例如,在 printf() 中使用 %s 修饰符),但不在其他类型的上下文中(例如,使用 %d 修饰符)。自从 PHP 5.2.0 以来,将没有 __toString 方法的对象转换为字符串将导致 E_RECOVERABLE_ERROR。
我认为如果您在 PHP <5.2 的情况下并且不是在 echo 或 print 上下文中使用它,则需要手动调用 __toString 方法。

2

升级 PHP

我正在处理相同的问题,我怀疑你最好的选择是将生产服务器上的 PHP 升级到 >= 5.2.0

在未来(我目前正在通过艰难的方式学习这一点),请尝试在开发和部署时使用相同的版本。


0

您需要安装 sudo apt install php7.0-mbstring,根据您的需求更改PHP版本。

之后不要忘记运行 service apache2 restart

希望这能帮到您。


0
你必须显式调用 PHP 魔术方法 __toString(),对于版本小于 5.2 的情况。因此,你的代码将变成这样:
    public function myname()
    {
       $name = $this->name;
       return $name.__toString(); //for php versions < 5.2,will also work > 5.2
    }

对于版本大于5.2的情况,__toString会自动调用


2
我猜你的意思是 $name->__toString(); - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接