0

PHP 5.3 から PHP 5.5 にアップグレードしたところ、__toString() メソッドを使用してオブジェクトを int にキャストするときに、以前は得られなかった警告に直面しています。

サンプルコードは

<?php

class MyObject {
    protected $_id;
    public function setId($id) { $this->_id = $id; }
    public function __toString() { return (string)$this->_id; }
}

$e = new MyObject();
$e->setId("50");
if($e == "50") echo "50 == 50 as String\n";
else echo "50 !== 50 as String\n";

$e->setId(50);
if($e == 50) echo "50 == 50 as Integer\n";
else echo "50 !== 50 as Integer\n";

$e->setId("50");
if($e == 50) echo "50 == 50 as String = Integer\n";
else echo "50 !== 50 as String = Integer\n";

$e->setId(50);
if($e == "50") echo "50 == 50 as Integer = String\n";
else echo "50 !== 50 as Integer = String\n";

私のサーバーの出力は

50 == 50 as String
50 !== 50 as Integer
50 !== 50 as String = Integer
50 == 50 as Integer = String

私はそれらすべてが真実であることを期待していましたが。実行中に受け取る通知は次のとおりです。

Object of class MyObject could not be converted to int

それらは、コードを含む行によってトリガーされます

($e == 50)

これは意図したものですか?PHP ini で別の動作をさせるために設定できる変数はありますか? それに対処することを学び、一部のコードでオブジェクトを整数として使用する可能性のあるすべてのコードを確認する必要がありますか?

4

3 に答える 3

0

Sammitch のコメントを引用して、私の質問に答えます。

あなたは、PHP で定義が不明確な型付けと変換の悪用に依存するコードをいくつか書きました。PHP 開発者はそれを修正し、コードを壊しました。解決策は、コードを修正し、PHP のルーズ タイピング システムの悪用について教訓を学ぶことです。

修正は、コードを見直し、コード行を次のいずれかに変更することでした

if("$e" == 50)

また

if($e->getId() == 50)
于 2014-09-30T18:49:09.643 に答える
0

これをより適切に行う1つの方法は、別のメソッドを定義することによる@bali182のソリューションです。または、比較中にオブジェクトを文字列にキャストできます。

if((string)$e == something)

いずれにしても、コードを変更する必要があります... *php 5.4.27 でテスト済み

于 2014-09-29T17:52:06.323 に答える