PHP 5.5 — PHP объект не может быть преобразован в Int

Я только что обновился с 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, чтобы она работала по-другому?
Нужно ли мне просто учиться справляться с этим и просматривать весь мой код, который может использовать объекты в качестве целых чисел в некоторых кодах?

0

Решение

Одним из способов сделать это лучше было бы решение @ bali182, определив другой метод, или вы можете привести объект к строке при сравнении:

if((string)$e == something)

В любом случае, вам придется изменить свой код …
* Проверено на php 5.4.27

0

Другие решения

Я собираюсь ответить на мой вопрос, цитируя комментарий Саммитча

Вы написали некоторый код, который основывается на злоупотреблении некоторыми плохо определенными махинациями типизации и преобразования в PHP, мы все это сделали в какой-то момент. Разработчики PHP исправили это и сломали ваш код. Решение состоит в том, чтобы исправить ваш код и извлечь урок о злоупотреблении свободной системой ввода PHP.

Исправление состояло в том, чтобы просмотреть наш код и изменить строки кода на

if("$e" == 50)

или же

if($e->getId() == 50)
0

Здесь нет valueOf в PHP, как у нас на лучших языках, и интерпретатор не достаточно хорош, чтобы пытаться преобразовать в строку, а затем в другие примитивы. Возможно, более старые версии поддерживали эту функцию, как вы утверждаете, я не знаю. Что вы можете сделать, это (int) (string) $myObject или же $myObject->toInt(), Для сравнения достаточно преобразовать в строку, PHP завершит все остальное, если мы говорим о свободном равенстве.

0
По вопросам рекламы [email protected]