Приведение типов данных php, array to object, object to array. Интересный баг php



Приведение типов в php делается просто:
$newTypeVar = (type)$var;

Ну или конкретные примеры:

1
2
$array = (array)$object;
$object = (object)$array;

Ну, а теперь о багах, возникающих при приведении типов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    // Объявляем массивчик
    $array = array('11' => 'one', 22 => 'two');
   
    print_r ($array);
    /*
        Получаем:
        Array
        (
            [11] => one
            [22] => two
        )
    */

   
    echo $array[11]."\r\n";
    // Получаем: one
   
   
   
   
   
    $stdClass = (object)$array;
   
    print_r ($stdClass);
    /*
        Получаем:
        stdClass Object
        (
            [11] => one
            [22] => two
        )
    */

   
    /*
        echo $array->11;
        вернет ошибку парсинга, т.к. наименование свойства объекта не может являться числом, но
        при автоматическом приведении типов в php названия свойств элементов объекта храняться с строке,
        но обратиться к ним невозможно, т.к. описать это для интерпритатора php не представляется возможным
            * $array->11;
            * $array->'11';
        Ничего из этого не сработает
    */


   
   
   
    $arrayTwo = (array)$stdClass;
   
    print_r ($arrayTwo);
    /*
        Получаем:
        Array
        (
            [11] => one
            [22] => two
        )
    */

   
    echo $arrayTwo[11];
    // Получаем: one

К сожалению похожих по тематике статей пока нет.

Добавить комментарий

10 Комментарии.

  1. Можно получить через foreach.

  2. Можно, но задача другая стояла.

  3. Ндааа действительно!

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php

    $array = array('a11' =>'1array', 22=>'2array');
    $obj = (object) $array;

    $obj->{'22'} = 4;
    var_dump($obj->{'22'}, $obj);

    /*
    int(4)
    object(stdClass)#1 (3) {
      ["a11"]=>
      string(6) "1array"
      [22]=>
      string(6) "2array"
      ["22"]=>
      int(4)
    }
    */

    Вам либо переменные именовать надо правильно, либо переводить массив в объект используя свою функцию.

    PS> Если чего-либо не знаете, то не говорите что это баг

    • :idea: Спасибо за комментарий, но грубить было не обязательно.
      К счастью я не спрашивал ни у кого как правильно именовать переменные и как перегнать массив в объект с помощью пользовательской функции т.к. суть проблемы была не в этом.

      Суть состояла именно в особенности работы.

  5. Спасибо за статью помогла в решении проблемы
    хотя он у меня заработал сразу
    а то что это баг в этой статье обратил позже :smile:

  6. Не знал про такие преобразования, перегонял из объекта в массив через foreach. Полезно, спасибо.

    • Пожалуйста! Старайтесь реже использовать итеративные алгоритмы – они съедают много процессорного времени. А уж если они нужны, то старайтесь искать решения, встроенные в php, там на C написаны функции – будет Гораздо быстрее. :!:

  7. Да уж, заметил, функций в php на все случаи жизни)

Ответить


[ Ctrl + Enter ]