操作
Bug(バグ) #1860
未完了php5.3 の環境でOpenPNE3に同梱しているPEARのライブラリを読み込んだ際にエラーになる
開始日:
2010-12-29
期日:
進捗率:
0%
予定工数:
3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)
説明
現象¶
PEAR の Calendar ライブラリを読み込むと発生
Deprecated: Assigning the return value of new by reference is deprecated in /opt/local/apache2/htdocs/OpenPNE3/lib/vendor/PEAR/Calendar/Month/Weekdays.php on line 132 Deprecated: Assigning the return value of new by reference is deprecated in /opt/local/apache2/htdocs/OpenPNE3/lib/vendor/PEAR/Calendar/Calendar.php on line 460
原因¶
オブジェクトを参照渡しにしている箇所がある PHP 5.3 ではエラーになる
[urabe@mac PEAR]$ ack -a "&( *?)new" Amazon/HTTP/Request.php 110: * $a = &new HTTP_Request('http://www.yahoo.com/'); 402: $this->_url = &new Net_URL($url, $this->_useBrackets); 720: $this->_sock =& new Net_Socket(); 733: $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); 778: $this->_url = &new Net_URL($redirect); Amazon/Services/AmazonECS4.php 1060: $http = &new HTTP_Request($url); 1087: $xml = &new XML_Unserializer(); Amazon/XML/Parser.php 576: $err = &new XML_Parser_Error($msg, $ecode); Amazon/XML/Unserializer.php 236: * $unserializer = &new XML_Unserializer(); 689: $value['value'] = &new $classname; 691: $value['value'] = &new $this->options[XML_UNSERIALIZER_OPTION_DEFAULT_CLASS]; 850: $this->_parser = &new XML_Parser($this->options[XML_UNSERIALIZER_OPTION_ENCODING_SOURCE], 'event', $this->options[XML_UNSERIALIZER_OPTION_ENCODING_TARGET]); Calendar/Calendar.php 460: $this->validator = & new Calendar_Validator($this); (略)
修正内容¶
参照渡しを使っているPERAのバージョンをあげて対処が可能なものは対処して、使っていないようなライブラリは削除でいいかと考えられます
Kousuke Ebihara さんがほぼ14年前に更新
修正内容について、気になった点があるので補足させてください。
参照渡しを使っているPERAのバージョンをあげて対処が可能なものは対処して、使っていないようなライブラリは削除でいいかと考えられます
- 参照渡しではなく参照代入です
- PHP 4 時代では、オブジェクトの代入がコピーになっていたため、オブジェクトの参照代入はメモリ使用量を抑えるテクニックとして多用されていました。したがって、 PEAR ライブラリのバージョンを上げたとしても、そのライブラリが PHP 4 対応を重視している場合は対応がおこなわれていない可能性があります
- オブジェクトの参照代入は、たしかに、スクリプトのパース時点で発生する警告であるため、「使っていないようなライブラリは削除でいい」とする気持ちもわからないでもないですが(とはいえ、スクリプトファイルを読み込まなければ警告は発生しないのですが)、その対応は後方互換性を壊します。そのライブラリに依存するプラグインなどがあった場合に、動作しないなどの影響を受けることでしょう。ライブラリを削除するのが悪いとは言いませんが、使用状況を調べるなどくれぐれも慎重に対処してください。また、安定版ではその対処はおこなわないでください
- 状況次第では、ライブラリを読み込むタイミングで一時的に E_DEPRECATED をエラーレベルから外すなどの対処をしたほうがインパクトが少ないのではないかと思われます
操作