Я только что обновился с PHP 5.3 до PHP 5.5, и я столкнулся с предупреждением, которое раньше не получал при приведении Object к int с использованием метода __toString ().
Пример кода
<?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, чтобы она работала по-другому?
Нужно ли мне просто учиться справляться с этим и просматривать весь мой код, который может использовать объекты в качестве целых чисел в некоторых кодах?
Одним из способов сделать это лучше было бы решение @ bali182, определив другой метод, или вы можете привести объект к строке при сравнении:
if((string)$e == something)
В любом случае, вам придется изменить свой код …
* Проверено на php 5.4.27
Я собираюсь ответить на мой вопрос, цитируя комментарий Саммитча
Вы написали некоторый код, который основывается на злоупотреблении некоторыми плохо определенными махинациями типизации и преобразования в PHP, мы все это сделали в какой-то момент. Разработчики PHP исправили это и сломали ваш код. Решение состоит в том, чтобы исправить ваш код и извлечь урок о злоупотреблении свободной системой ввода PHP.
Исправление состояло в том, чтобы просмотреть наш код и изменить строки кода на
if("$e" == 50)
или же
if($e->getId() == 50)
Здесь нет valueOf
в PHP, как у нас на лучших языках, и интерпретатор не достаточно хорош, чтобы пытаться преобразовать в строку, а затем в другие примитивы. Возможно, более старые версии поддерживали эту функцию, как вы утверждаете, я не знаю. Что вы можете сделать, это (int) (string) $myObject
или же $myObject->toInt()
, Для сравнения достаточно преобразовать в строку, PHP завершит все остальное, если мы говорим о свободном равенстве.