2011-03-10 58 views
2

我必须将一个网站(自定义编写(不是我)),所以只是更新CMS不是一个选项)到PHP 5.3服务器。该代码抱怨::我可以在PHP 5.3中恢复旧的__tostring()行为吗?


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 dev外包公司过去为我工作的公司编写的代码。我的任务是将网站从共享主机提供商移到我管理的专用服务器(我在那里运行Ubuntu 10.04 LTS服务器),并且我宁愿不要降级到PHP 5.2。如果我能够使用一些配置魔法,它将会很棒。我担心,如果我修改一个方法,那么整个事情就会按预期停止工作。

+0

有迫使4兼容性INI参数,但它已被删除。 – powtac 2011-03-10 14:02:19

+1

通常不直接调用__toString()。它在类中用于决定将对象作为字符串进行转换时要执行的操作。所以问题是,你的__toString()方法的目的是什么? – powtac 2011-03-10 14:05:06

+2

我不认为在弃用的行为中坚持是要走的路,也许你应该考虑更新你的代码,找到完成相同任务的另一种方式。 – Terseus 2011-03-10 14:06:16

回答

4

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

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

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

这将使5.3调用隐含的__toString为"$so";,但仍允许手动$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); 
} 
+0

谢谢。我已将代码添加到问题主体中。它看起来很简单,但我不知道如何修改它以符合PHP 5.3,并仍然按照预期的方式工作(通过所有其他可以依赖的代码)。 – Ivan 2011-03-10 14:30:35

+0

@Ivan:请参阅编辑 – mario 2011-03-10 14:37:53

+0

它不被弃用,因为它已经存在,因为从PHP5开始,在此之前它已经在受保护的函数名称列表中。 – powtac 2011-03-10 14:50:12

2

如果问题只出现在这个类中,您可以更新该类的代码。

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

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

编辑:好吧,我认为更好的解决办法是:

  1. 重命名方法和他的所有电话。因为,__toString保留给magick方法:printDate($fomat='Y-m-d')
  2. 添加一个新的方法__toString()调用您的printDate()

及用途:

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

我已将代码添加到问题正文中。它看起来很简单,但我不知道如何修改它以符合PHP 5.3,并仍然按照预期的方式工作(通过所有其他可以依赖的代码)。 – Ivan 2011-03-10 14:29:11

相关问题