我可以在PHP 5.3中恢复旧的__tostring()行为吗?

时间:2011-03-10 13:58:10

标签: php deprecated php-5.3

我必须移动一个网站(自定义编写(不是由我),所以只是更新CMS不是一个选项)到PHP 5.3服务器。代码抱怨::


Fatal error: Method cDate::__tostring() cannot take arguments in ...\lib.datetime.php on line 183

我已经google了解问题是因为“使用PHP 5.3魔术方法__tostring()不再接受任何参数”,“...通过接受参数来实现其__tostring()...现在是不赞成使用PHP 5.3的新__tostring()。 这是代码:


public function __toString($format = 'Y-m-d')
{
  // the next is the line #182, the line #183 mentioned in the error message is the closing brace
  return date($format, $this->_stamp);
}

是否有类似php.ini参数的东西我可以通过调整来恢复工作?

我不是PHP开发人员,我也不太愿意深入研究和修改由我工作的公司过去的一些Web开发外包公司编写的代码。我的任务是将网站从共享托管服务提供商转移到我管理的专用服务器(我在那里运行Ubuntu 10.04 LTS服务器),我非常不希望降级到PHP 5.2。这将是伟大的如果我可以让它与一些配置魔术一起工作。我担心如果我修改一个方法,那么整个事情就会按预期停止工作。

2 个答案:

答案 0 :(得分:4)

您无法再次使__toString()接受参数。方法签名需要很浅。 (我同意这是一个不必要的弃用,为什么他们不会抛出E_DEPRECATED而不是产生致命的不兼容性是不太明智的。)

唯一的解决方法是使用func_get_args()代替实际参数:

class EmptyString { 
    function __toString() {
        print_r(func_get_args());
        return "";
    }
}

这将使5.3为"$so";调用隐式__toString,但仍允许手动$so->__toString(_WITH, "params");

该方案当然不允许参数默认的简单性。而且,由于您的目标是让遗留应用程序正常运行,因此这是不够的。您需要在基类中实现此变通方法,并将现有的__toString方法调整为__oldString,并在compat模式下调用它。没有办法改写一下。


没有任何复杂的包装器方法,您的具体示例代码适用:

public function __toString()
{
    $format = func_get_arg(0)   or   $format = 'Y-m-d';

    return date($format, $this->_stamp);
}

答案 1 :(得分:2)

如果问题仅出在此课程中,您可以更新该课程的代码。

创建一个覆盖方法__toString(),它接受参数,调用是父方法或完全重写方法的代码(我认为这不是那么难)。

但是对于更多信息,我们需要一些代码来解决上下文中的问题。

编辑:好的,我认为更好的解决方案是:

  1. 重命名该方法及其所有通话。因为,__ toString是为magick方法保留的:printDate($fomat='Y-m-d')
  2. 添加一个调用printDate()
  3. 的新方法__toString()

    并使用:

    public function __toString()
    {
        $format = isset(func_get_arg(0) ? func_get_arg(0) : 'Y-m-d';
        return date($format, $this->_stamp);
    }