Кастинг массива с числовыми ключами как объект

Я не уверен, так как я не пользователь Oracle, но я предполагаю, что различие заключается при использовании многобайтовых наборов символов, таких как Unicode (UTF-16/32). В этом случае 11 байтов могли составлять меньше чем 11 символов.

Также те типы поля можно было бы рассматривать по-другому в отношении символов с диакритикой, или случай, например, 'binaryField (ete) = "Г©tГ©"' не будет соответствовать, в то время как 'charField (ete) = "Г©tГ©"' мог бы (снова не уверенный в Oracle).

12
задан Mike Purcell 19 April 2012 в 21:03
поделиться

2 ответа

Да, они просто заблокированы, если их не вернуть в массив. В PHP есть несколько небольших ошибок, например, в более старых версиях вы могли определить константу как массив, но никогда не обращаться к ее элементам. Даже сейчас вы можете определить константу как ресурс (например, define ('MYSQL', mysql_connect ()); ), хотя это приводит к довольно непредсказуемому поведению, и, опять же, этого следует избегать.

Как правило, , по возможности лучше избегать преобразования массива в объект. Если вам действительно нужно это сделать, рассмотрите возможность создания нового экземпляра stdClass , а затем вручную переименуйте все переменные, например, в _0 , _1 и т. Д.

$a = array('cat','dog','pheasant');
$o = new stdClass;
foreach ($a as $k => $v) {
    if (is_numeric($k)) {
        $k = "_{$k}";
    }
    $o->$k = $v;
}

РЕДАКТИРОВАТЬ: Только что провел еще одну быструю проверку этой гипотезы, и да, они официально «не существуют» в контексте объекта; данные хранятся, но к ним невозможно получить доступ, и поэтому они являются конечным частным членом. Вот тест:

$a = array('one','two','three');
$o = (object)$a;
var_dump(property_exists($o, 1), property_exists($o, '1'));

И результат:

bool(false)
bool(false)

РЕДАКТИРОВАТЬ СНОВА: Интересное примечание, следующая операция возвращается неверно:

$a = array('one','two','three','banana' => 'lime');
$b = array('one','two','banana' => 'lime');

$y = (object)$a;
$z = (object)$b;

var_dump($y == $z);
14
ответ дан 2 December 2019 в 07:02
поделиться

Я думаю, вы получаете ошибку, потому что приведение целочисленного ключа массива к объекту / подобъекту нарушит соглашение об именах переменных PHP.

Советы:

  • Перед руками решите, следует ли вы хотите иметь OBJECT или ARRAY
  • Будьте осторожны с приведением типов (например, (object) array (1 => 'string') не делайте таких вещей)
  • Используйте приведение типов для проверки, а не для преобразования
  • Избегайте использования объектов в качестве «поддельных» массивов
0
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: