За последние 24 часа нас посетили 23032 программиста и 1239 роботов. Сейчас ищут 804 программиста ...

Как обойти проблему?

Тема в разделе "Прочие вопросы по PHP", создана пользователем kadet, 10 апр 2013.

  1. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    Столкнулся с такой задачей:
    Есть код
    Код (Text):
    1. <?php
    2.  
    3. class TTag
    4.     {
    5.      function TTag($tag_name,$tag_content)
    6.          {
    7.           $this->tag_name = $tag_name;
    8.           $this->tag_content = $tag_content;
    9.          }
    10.     }
    11.    
    12. $item = array(
    13.      new TTag('span','{label1}'),
    14.      new TTag('a','link1'));
    15.    
    16. $items = array($item,$item,$item,$item);
    17.  
    18. ?>
    теперь если сделать следующее присвоение
    Код (Text):
    1. <?php
    2.  
    3. $items[1][1]->href = 'text1.data';
    4.  
    5. print_r($items);
    6.  
    7. ?>
    то результатом будет нечто следующее
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => TTag Object
    6.                 (
    7.                     [tag_name] => span
    8.                     [tag_content] => {label1}
    9.                 )
    10.  
    11.             [1] => TTag Object
    12.                 (
    13.                     [tag_name] => a
    14.                     [tag_content] => link1
    15.                     [href] => text1.data
    16.                 )
    17.  
    18.         )
    19.  
    20.     [1] => Array
    21.         (
    22.             [0] => TTag Object
    23.                 (
    24.                     [tag_name] => span
    25.                     [tag_content] => {label1}
    26.                 )
    27.  
    28.             [1] => TTag Object
    29.                 (
    30.                     [tag_name] => a
    31.                     [tag_content] => link1
    32.                     [href] => text1.data
    33.                 )
    34.  
    35.         )
    36.  
    37.     [2] => Array
    38.         (
    39.             [0] => TTag Object
    40.                 (
    41.                     [tag_name] => span
    42.                     [tag_content] => {label1}
    43.                 )
    44.  
    45.             [1] => TTag Object
    46.                 (
    47.                     [tag_name] => a
    48.                     [tag_content] => link1
    49.                     [href] => text1.data
    50.                 )
    51.  
    52.         )
    53.  
    54.     [3] => Array
    55.         (
    56.             [0] => TTag Object
    57.                 (
    58.                     [tag_name] => span
    59.                     [tag_content] => {label1}
    60.                 )
    61.  
    62.             [1] => TTag Object
    63.                 (
    64.                     [tag_name] => a
    65.                     [tag_content] => link1
    66.                     [href] => text1.data
    67.                 )
    68.  
    69.         )
    70.  
    71. )
    Как видно, каждый элемент начального массива во втором тэге стал иметь ''href = text1.data".
    По всей видимости это связано с тем как происходит присвоение объекта значению массива.
    Возник вопрос, как можно это обойти наиболее просто.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    каждый элемент начального массива это один и тот же объект. естественно, что свойства этого объекта одинаковы во всех ссылках на него.
    начиная, кажется, с PHP 4 присвоение объекта это копирование ссылки, а не создание нового экземпляра.
     
  3. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    kadet - у вас какая версия php? 5.x.x.?

    Если да, то почему читаете документацию по php 4?
    В пятой версии значительно переработали работу с объектами и классами
     
  4. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    PHP Version 5.3.13

    /почему читаете документацию по php 4/ не понял вопроса. Проблема-то всё равно остаётся.

    Вообщето есть способ её обойти, создавать для каждого элемента отдельный объект, но это не очень эффективно на мой взгляд.
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    У вас, по сути, два варианта:
    1. количество объектов равно количеству тэгов
    2. один объект, содержащий массив всех тэгов
     
  6. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    спасибо.
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Так делать нет необходимости.

    Я придумал вообще новую систему:
    Код (PHP):
    1. %theme uses="theme"%
    2. (text value="Какой-то текст...")
    3. <new_tag uses="new_tag">
    И конструкцию сделал тоже)
    Код (PHP):
    1. <if name_block></if>
    Где:
    value-это обычной текст
    uses-реализованная переменная для этого тега

    Пример:
    Вывод:
    Код (PHP):
    1. <p>
    2.     (text)
    3. </p>
    4. <if theme>
    5.     <div>
    6.         %theme%
    7.     </div>
    8. </if>
    9. <div>
    10.     <new_tag>
    11. </div>
    Ну вы с этим не парьтесь, это я так для виду...
    Там очень большой проект будет)
    И закончить его не хватает времени, на свои идеи), работа же еще...

    Лучше будет регуляркой и массивом сделать, а не объектами.