За последние 24 часа нас посетили 30875 программистов и 1440 роботов. Сейчас ищут 919 программистов ...

Не передаётся массив. В класс->

Тема в разделе "PHP для новичков", создана пользователем askanim, 7 апр 2016.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Всем доброго времени суток подскажите мне пожалуйста уже пол дня голову ломаю и вычитать ни где не могу что не так. Я проходил курс ООП полиморфизм. И вот пример того крутого человека что он написал, сделал так же как и он но у меня не работает...
    файл classes.php
    Код (PHP):
    1. <?php 
    2.   
    3.   class publication {
    4.         public $id;
    5.         public $title;
    6.         public $date;
    7.         public $short_content;
    8.         public $content;
    9.         public $preview;
    10.         public $author_name;
    11.         public $type;
    12.         
    13.         public function _construct($row) {
    14.             
    15.             $this->id = $row['id'];
    16.             $this->title = $row['title'];
    17.             $this->date = $row['date'];
    18.             $this->short_content = $row['short_content'];
    19.             $this->content = $row['content'];
    20.             $this->preview = $row['preview'];
    21.             $this->author_name = $row['author_name'];
    22.             $this->type = $row['type'];
    23.         } 
    24.     }
    25.     $obj1 = new publication;
    26.     echo $obj1->title;
    27.     class NewsPublication extends publication {
    28.         
    29.         public function printItem() {
    30.             echo '<div style="width:600px; margin:0px auto;">';
    31.                 echo '<h1 style="text-align:center; font-size:18px;">Новость: '.$this->title.'</h1>';
    32.                 echo '<p style="text-align:leftt>"<img src="'.$this->preview.'"  /></p>';
    33.                 echo '<pre style="color:#333333; text-align:center; font-size:14px; ">'.$this->short_content.'</pre>';
    34.                 echo '<p style="font-size:12px; text-align:right; color:#dedede;"><i>'.$this->author_name.'/'.$this->date.'</i></p>';
    35.                 echo '<hr>';
    36.             echo '</div>';
    37.         }
    38.     }
    39.     class PhotoReportPublication extends publication {
    40.         public function printItem() {
    41.             echo '<div style="width:600px; margin:0px auto;">';
    42.                 echo '<h1 style="text-align:left; font-size:18px;">Новость: '.$this->title.'</h1>';
    43.                 echo '<p style="text-align:center>"<img src="'.$this->preview.'"  /></p>';
    44.                 echo '<pre style="color:#333333;text-align:left; font-size:14px; ">'.$this->short_content.'</pre>';
    45.                 echo '<p style="font-size:12px; text-align:right; color:#dedede;"><i>'.$this->author_name.'/'.$this->date.'</i></p>';
    46.                 echo '<hr>';
    47.             echo '</div>';
    48.         }
    49.     }
    50.     class ArticlePublication extends publication {
    51.         
    52.         public function printItem() {
    53.             echo '<div style="width:600px; margin:0px auto;">';
    54.                 echo '<h1 style="text-align:right; font-size:18px;">Новость: '.$this->title.'</h1>';
    55.                 echo '<p style="text-align:right>"<img src="'.$this->preview.'"  /></p>';
    56.                 echo '<pre style="color:#333333; text-align:right; font-size:14px; ">'.$this->short_content.'</pre>';
    57.                 echo '<p style="font-size:12px; text-align:left; color:#dedede;"><i>'.$this->author_name.'/'.$this->date.'</i></p>';
    58.                 echo '<hr>';
    59.             echo '</div>';
    60.         }
    61.     }
    62. ?>
    затем файл data.php
    Код (PHP):
    1. <?php
    2.     
    3.     include '../../db_connect.php';
    4.     require_once 'classes.php';
    5.     $publications = array();
    6.     
    7.     $request = 'SELECT * FROM publication ORDER BY id DESC'; 
    8.     
    9.     $result = mysqli_query($connect_db, $request);
    10.     
    11.     while ($row = mysqli_fetch_array($result)) {
    12.         
    13.         $publications[] = new $row['type']($row); 
    14. /* Мне кажется здесь собака зарыта... не передаётся данный массив $row в файл classes.php в класс publication в конструктор*/
    15.         
    16.         
    17. }
    18.  
    19. ?>
    ну и третий файл publication.php
    Код (PHP):
    1. <?php 
    2.      require_once 'data.php';
    3.      foreach ($publications as $item) {
    4.         
    5.          echo $item->printItem();
    6. }
    7. ?>
    Только один момент у меня версия php 5.2
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Я так понимаю, что ты учишь ещё язык. Знаешь что сейчас последняя версия PHP 7?
    Или тебе специально под 5.2 нужно писать код?
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Да есть движок и он 5.2 на нём все мои проекты... Пока не могу перепрыгнуть с него, и переделать его под 5,6 и выше не в состоянии пока что. В связи с этим мой сервер в интернете настроен и на нём старая версия php 5.2 =(

    Можете подсказать как правильно мне передать массив $row в файл в класс publication... ?) Буду чрезмерно благодарен, заодно буду понимать различия версий... Пригодится.
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. $publications[] = new publication($row);
    https://php.net/manual/ru/language.oop5.decon.php#object.constructvoid __construct ([ mixed $args = "" [, $... ]] )

    тут дали понять, что в конструктор как и с методами/функциями, можно использовать аргументы
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Заменил не помогло, только ошибку выдало, ошибок то нет при использовании того кода. Просто в classes.php не попадет массив в класс.
    Код (PHP):
    1. while ($row = mysqli_fetch_array($result)) {
    2.         
    3.         $publications[] = new $row['type']($row); // часть с new $row['type'] - это работает подставляется имя класса из базы тут то работает, а вот часть ($row) как то не пашет здесь может что то должно быть подругому чтобы записать данные в массив, там должны подставляться наименование класса и передоваться в него массив $row, из базы. 
    4.         
    5.         
    6. }
    Добавлено спустя 9 минут 9 секунд:
    Массив я получае в date.php вывод на экран массива из базы есть... Мне нужно теперь это массив в classes.php получить... быть может я не правильно получаю массив в classes.php и это не правильная запись?
    Код (PHP):
    1. public function _construct($row)
    2.  
     
  6. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    объяснить можешь, что тут происходит?? прям как можно подробнее (;
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Да массив $row с записями существует я его вывел он есть в любом файле вылазит вопрос как конструктору сообщить что все переменные лежат в массиве $row :?
     
  8. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    видимо не совсем понимаешь эту запись... ((:)

    давай тогда поступим так, сделай var_dump $row['type']($row)... Так быстро все вопросы отпадут (:)
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Смотрите я открываю publication.php код выше написан. и там же вывожу с помощью полиморфизма, функцию
    Код (Text):
    1. printItem();
    которая находится в файле classes.php код тоже выше его есть, вот эта функция по идее выводит мне новости из бд. А файл data.php отвечает за запрос к бд, и выборку с помощью цикла, дальше запихиваю всё это в массив publications в data.php . короче суть в том что я не передаю в функцию конструктора агремент $row который по идее должен являться массивом, а он туда не передатся так как в функцию не поступают значения из него ! я вывожу ниже класса с помощью обьектов не выводит не чего там пустота как будто туда и не вошло не чего.
    Код (PHP):
    1. class publication {
    2.         public $id;
    3.         public $title;
    4.         public $date;
    5.         public $short_content;
    6.         public $content;
    7.         public $preview;
    8.         public $author_name;
    9.         public $type;
    10.         
    11.         public function _construct($row) {
    12.             //всё массив вроде должен быть но я не получаю значений его. 
    13.             $this->id = $row['id'];
    14.             $this->title = $row['title'];
    15.             $this->date = $row['date'];
    16.             $this->short_content = $row['short_content'];
    17.             $this->content = $row['content'];
    18.             $this->preview = $row['preview'];
    19.             $this->author_name = $row['author_name'];
    20.             $this->type = $row['type'];
    21.         } 
    22.     }
    23.     $obj1 = new publication;
    24.     echo $obj1->title; // тут пустота не выводит он не фига (((( 
    25.  
    Добавлено спустя 1 минуту 57 секунд:
    ошибка синтаксиса
     
  10. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    ну вот и молодец! исправляй (:)
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    $publications[] = new $row['type']- здесь подставляется из базы данных наименование тип, в точности такой же как и в у меня наименования класса а затем запись в скобках ($row) по идее должна забить туда массив с данными $row на каждой итерации цикла;
    запись добавляет в массив данные из бд.

    Добавлено спустя 1 минуту 6 секунд:
    а как в 5.2 правильно внести массив данных, это запись как в 5.5 делают или где почитать про это не могу мануал конкретно по 5,2 массивов найти
     
  12. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    так по твоей идее... (:) интерпретатор php 5.2 так не считает, как видишь (;
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ахах... Да ему вообще всё равно, а я не бось просто не правильно пытаюсь массив в массив положить если это вообще возможно... я не знаю :D
     
  14. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    могу предложить разбить эту строку $row['type']($row) на две строки (;
    думаю, тогда вы найдете общий язык ((:)
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я попробовал задать строковое значение переменной ситуацию не спасло

    Код (PHP):
    1.         $name = $row['type'];
    2.         strval($name);
    3.         echo $name;
    4.         $publications[] = new $name($row);

    Предлагай, я уже без понятия что делать ....
     
  16. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    а ты точно понимаешь, что происходит в этой записи - $publications[] = new $name($row); ?? (:)
     
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    создаётся обьект по классу с параметрами $row не?
     
  18. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    askanim, каждый шаг отлаживай. В слепую ты ничего не сделаешь. Метод тыка он такой, что в тупик может загнать.
     
  19. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    предположим... а когда создаются эти объекты, php о них что нить знает? (;
     
  20. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Код (PHP):
    1.  $publications[] = new $name($row); 
    А эм разве не так создаётся объект?
     
  21. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    что бы что-то создать, надо хотя бы что-то знать (; смекаешь?
     
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Есть же классы этих объектов... По ним создаются объекты конструкцией/
    Код (PHP):
    1. class class_obj {
    2.         
    3.         public $run;
    4.         public function _construct ($run) {
    5.          $this->run  = $run;
    6. }
    7. }
    8. obj1 = new class_obj(10);
    9.  
    Правильно ведь всё написал... Так у меня всё тоже только значеняи из базы подставлятсья должны но не подставляются...
     
  23. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    если бы ты правильно написал и правильно думал, как php машина - то у тебя бы ща всё работало бы... но увы...
    ты что-то не до конца охватываешь... Советую, если запарился - пойти отдохнуть (;
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    у меня 5 утра мне блин хочется сделать чтобы работало а потом спать упасть честно...

    Добавлено спустя 42 секунды:
    Уже даже так попробовал...
    Код (PHP):
    1.  while ($row = mysqli_fetch_array($result)) {
    2.         $row = array ($row['id'], $row['title'], $row['date'], $row['short_content'], $row['content'], $row['preview'], $row['author_name'],'type' => $row['type']);
    3.       
    4.         $publications[] = new $row['type']($row);
    5.         
    6. }
    как масло масленное какое то