Перейти к содержимому


Помогите объяснить один момент в ООП на PHP новичку

новичок в ООП Свойство класса

Сообщений в теме: 92

#41 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 22 Ноябрь 2019 - 10:59

здравствуйте, помогите разобраться с массивами:

$arr = array();
foreach($result as $item){
if($item['parent_id'] == 0){
$arr[$item['brand_id']][] = $item['brand_name'];
}
else{
//
}
}
return $arr;

ПРИМЕР С ВОПРОСАМИ НА 1 ИТЕРАЦИИ:

Array // Это массив обертка (как бы переменная в которую мы вкладываем выборку) $arr[]- верно?
(
	[1] => Array // Это массив 2 - верно $arr[$item['brand_id']] ?
		(
			[0] => WILO //Это массив 3 или это тело массива 2 [] = $item['brand_name'] ?
		)
)

Как мне здесь понять последовательность, на что надо смотреть чтобы понять кол-во массивов, на явное указание Array или на ключ=>значение?

Спасибо!

Сообщение отредактировал dim81: 22 Ноябрь 2019 - 11:19


#42 Я.Сергей

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 1 796 сообщений
Репутация: 314

Отправлено 22 Ноябрь 2019 - 12:17

Добрый день

Просмотр сообщенияdim81 (22 Ноябрь 2019 - 10:59) писал:

здравствуйте, помогите разобраться с массивами:

Как мне здесь понять последовательность, на что надо смотреть чтобы понять кол-во массивов, на явное указание Array или на ключ=>значение?

Спасибо!

Array // Это массив обертка (как бы переменная в которую мы вкладываем выборку) $arr[]- верно!
(
[1] => Array // Это вложенный массив который является элементом верхнего массива $arr[$item['brand_id']] верно!
	(
	  [0] => WILO //Это элемент вложенного массива со значением  $item['brand_name'] ?
	)
)

смотреть нужно на всё)))
если есть указатель Array - значит это массив (он может быть вложенным, т.е. такая конструкция [1] => Array() )
иначе это просто элемент массива (вчасности вложенного) [ключ] => значение

в первом случае у вас элементом массива является другой массив
во втором случае в массиве обычные элементы

#43 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 22 Ноябрь 2019 - 14:38

1 Вопрос - то есть у меня 2 массива, если я понял с ваших слов?
- 1-ый массив общий (обертка) ,
- 2-ой массив индексный [1]=>Array и у него в теле круглых скобок обычные элементы:[0]=> WILO

#44 Я.Сергей

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 1 796 сообщений
Репутация: 314

Отправлено 25 Ноябрь 2019 - 09:10

Здравствуйте,

Цитата

то есть у меня 2 массива
не совсем так,
у вас есть многомерный массив, который содержит в себе другой массив в качестве своего элемента
в свою очередь вложенный массив содержит все обычные элементы ключ=>значение

на самом деле, мне кажется, что ваш массив гораздо объёмнее и вы показали только малую его часть
в любом случае попробуйте обычными словами проговорить что у вас в чём находится,
т.е. примерно так - "У меня есть массив, в котором все элементы так же являются массивами, в которых и хранятся нужные мне данные"

#45 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 25 Ноябрь 2019 - 12:26

Извиняюсь. Конечно, массивов больше, но я выше рассматривал пример на 1 итерации, чтобы понять принцип работы:

ПРИМЕР С ВОПРОСАМИ НА 1 ИТЕРАЦИИ:
Array // Это многомерный массив 1 - $arr[]- верно?
(
[1] => Array // Это вложенный массив 2 на 1 итерации - $arr[$item['brand_id']] верно ?
(
[0] => WILO //Это ключ и значение [] = $item['brand_name'] ?
)
)

#46 Я.Сергей

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 1 796 сообщений
Репутация: 314

Отправлено 25 Ноябрь 2019 - 12:40

всё верно )))

только в этой строке

Цитата

[1] => Array // Это вложенный массив 2 на 1 итерации
тоже ключ - значение, но значением является массив
ключ -1 => значение массив

#47 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 25 Ноябрь 2019 - 15:37

уфф..)) Спасибо большое, теперь все стало на свои места!!!

пожалуй, сохраню себе инфу, чтобы не забыть).

Сообщение отредактировал dim81: 25 Ноябрь 2019 - 15:52


#48 Я.Сергей

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 1 796 сообщений
Репутация: 314

Отправлено 26 Ноябрь 2019 - 06:26

не за что :)

P.S. ещё больше о массивах читайте в документации PHP ;)

#49 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 09 Декабрь 2019 - 17:57

Здравствуйте!

В уроке 13 "Полный текст новостей" мы в Модели формируем запрос:

public function get_news_text($id){
$result = $this->ins_driver->select(array('title','text','date','keywards','discription'),
'news',
array('news_id'=>$id));
return $result[0];
}

В конце возвращаем return $result[0]; с нулевой ячейкой, чтобы избавиться от многомерного массива.
Вопрос: А как вывести с многомерным массивом, то есть если мы вернули return $result; ?
Я пробовал в файле news_page.php выводить вот так, (то есть везде указываю еще одну пустую ячейку для массива):

<td class="content">

<? if($news_text):?>

<h1><?php echo $news_text[]['title'];?></h1>

<span class="news-date"><?=date("d.m.Y"),$news_text[]['date']?></span>

<p><?=$news_text[]['text'];?></p>

<?endif;?>
</td> 

Выдает ошибку.
Или мне нужно в таком случае обязательно использовать цикл foreach ? - Как вывести массив многомерный, в файле news_page.php, если мы в Модели просто возвращаем return $result; ?
Спасибо!

Сообщение отредактировал dim81: 09 Декабрь 2019 - 18:13


#50 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 09 Декабрь 2019 - 18:19

Решил задачку. Помог такой вариант в news_page.php - <h1><?php echo $news_text[0]['title'];?></h1>

То есть, получается, что если мы в Модели не возвращаем [0], а возвращаем как есть многомерный массив return $result;, то этот ноль мы должны передать уже там где мы выводим наши значения, в данном случае это файл news_page.php
<td class="content">

<? if($news_text):?>

<h1><?php echo $news_text[0]['title'];?></h1>

<span class="news-date"><?=date("d.m.Y"),$news_text[0]['date']?></span>

<p><?=$news_text[0]['text'];?></p>

<?endif;?>

</td>
Спасибо всем!!!

#51 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 115 сообщений
Репутация: 285

Отправлено 09 Декабрь 2019 - 18:54

Просмотр сообщенияdim81 (09 Декабрь 2019 - 18:19) писал:

Решил задачку. Помог такой вариант в news_page.php - <h1><?php echo $news_text[0]['title'];?></h1>

То есть, получается, что если мы в Модели не возвращаем [0], а возвращаем как есть многомерный массив return $result;, то этот ноль мы должны передать уже там где мы выводим наши значения, в данном случае это файл news_page.php
<td class="content">

<? if($news_text):?>

<h1><?php echo $news_text[0]['title'];?></h1>

<span class="news-date"><?=date("d.m.Y"),$news_text[0]['date']?></span>

<p><?=$news_text[0]['text'];?></p>

<?endif;?>

</td>
Спасибо всем!!!
Здравствуйте!
По сути Вы сами решаете что Вам нужно вернуть. Если в результате отработки функции - Вы получаете многомерный массив, длина которого равна 1, то вернуть можно только его содержимое, используя индекс 0.

#52 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 27 Декабрь 2019 - 19:24

Здравствуйте, снова вопрос по синтаксису.
До 15 урока мы везде занимались наследованием классов или же, ранее связывали файлы инклюдами.

А в 16 уроке мы создаем объект в файле Archive_Controller

$pager = new Pager(
$page,
'news',
array(),
'date',
'DESC',
QUANTITY,
QUANTITY_LINKS
);

При этом не понятно: файл Archive_Controller никак не связан с файлом Peger, но объект как-то находит свой класс, класс описан в Peger.

То ли я что-то упустил из теории, то ли подзабыл.

У меня остается последнее предположение, что new Pager и есть явная ссылка на класс, который может быть описан в любом файле и при этом не иметь наследования.

Разъясните, пожалуйста, этот момент, поскольку не нашел разъяснение о видимости непосредственно самого объекта класса в различных файлах.
Спасибо!

#53 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 115 сообщений
Репутация: 285

Отправлено 28 Декабрь 2019 - 06:35

Просмотр сообщенияdim81 (27 Декабрь 2019 - 19:24) писал:

Здравствуйте, снова вопрос по синтаксису.
До 15 урока мы везде занимались наследованием классов или же, ранее связывали файлы инклюдами.

А в 16 уроке мы создаем объект в файле Archive_Controller

$pager = new Pager(
$page,
'news',
array(),
'date',
'DESC',
QUANTITY,
QUANTITY_LINKS
);

При этом не понятно: файл Archive_Controller никак не связан с файлом Peger, но объект как-то находит свой класс, класс описан в Peger.

То ли я что-то упустил из теории, то ли подзабыл.

У меня остается последнее предположение, что new Pager и есть явная ссылка на класс, который может быть описан в любом файле и при этом не иметь наследования.

Разъясните, пожалуйста, этот момент, поскольку не нашел разъяснение о видимости непосредственно самого объекта класса в различных файлах.
Спасибо!
Здравствуйте!
Все довольно просто, еще в начале мы с Вами описывали функцию автоматической загрузки классом, вот собственно при создании объекта, она и отрабатывает и подключает необходимый файл.

#54 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 28 Декабрь 2019 - 12:06

Спасибо, у меня как-то совсем вылетело из головы, сейчас просмотрю и освежу все. Повторение - мать учения.

#55 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 06 Январь 2020 - 18:24

Здравствуйте, с наступившем НГ!

У меня назрел очень актуальный вопрос по промежуточным переменным.
ПРИМЕРЫ:
Вот учебный код:
public $db;

public function __construct($host,$user,$pass,$db) {
$this->db = mysql_connect($host,$user,$pass);
if(!$this->db) {
exit('No connection with database');
}
if(!mysql_select_db($db,$this->db)) {
exit('No table');
}

mysql_query("SET NAMES cp1251");

return $this->db;
}
Вот мой код:
public function __construct($host,$user,$pass,$db){

if(!$con = mysql_connect($host,$user,$pass)){
exit('not m_connect');
}

if(!mysql_select_db($db,$con)){
exit('not m_select_db');
}

mysql_query('SET NAMES cp1251');

}
Вот упрощенный код, когда мы уже что-то вывели и убедились, что все работает:
public function __construct($host,$user,$pass,$db){

$con = mysql_connect($host,$user,$pass)

mysql_select_db($db,$con);

mysql_query('SET NAMES cp1251');

}

ВОПРОСЫ:
1. В учебном коде мы заносим соединение БД $this->db = mysql_connect($host,$user,$pass);в свойство,
а mysql_select_db($db,$this->db) в свойство не заносим, вопрос почему?
2. Всегда ли необходимо использовать промежуточные переменные или они больше для наглядности кода?
3. Если я сокращаю код, как в примерах выше или ниже, я экономлю память или создание промежуточной переменной на экономию памяти не влияет?
- можно так:
$sql = "SELECT id,title,description FROM statti";
$res = mysql_query($sql);

- а можно так:
$res = mysql_query("SELECT id,title,description FROM statti");
Последний пример более короткий и используется одна промежуточная переменная вместо двух.

4. Обязательно ли метод __construct в примере выше должен возвращать - return отработку метода? Вроде он как автоматический и при создании класса он и так производит свою отработку.

СПАСИБО!

Сообщение отредактировал dim81: 06 Январь 2020 - 18:50


#56 Вероломство

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений
Репутация: 0

Отправлено 08 Январь 2020 - 16:14

дата регистрации 2014, Вы 6 лет к такому коду шли?

первые 3 пункта сжечь и забыть навсегда о таком коде

4) конструктор ничего не возвращает, return в нём будет проигнорирован, не вернёт ничего и не остановит выполнение кода, потому что так гласит https://www.php.net/....oop5.decon.php

__construct ([ mixed $args [, $... ]] ) : void

VOID

#57 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 10 Январь 2020 - 17:24

?

Сообщение отредактировал dim81: 10 Январь 2020 - 17:50


#58 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 10 Январь 2020 - 17:49

Просмотр сообщенияВероломство (08 Январь 2020 - 16:14) писал:

дата регистрации 2014, Вы 6 лет к такому коду шли?

первые 3 пункта сжечь и забыть навсегда о таком коде

4) конструктор ничего не возвращает, return в нём будет проигнорирован, не вернёт ничего и не остановит выполнение кода, потому что так гласит https://www.php.net/....oop5.decon.php

__construct ([ mixed $args [, $... ]] ) : void

VOID

1. мне не очень понятна суть вашего вопроса. Да, я зарегистрирован в 2014 году и что с того?)) Какая разница сколько я шел и куда я шел, суть этого вопроса в чем?))

2. Код я написал же - учебный, то есть это авторский курс по нативному php не важно какой версии языка php.

3. Напишите тогда как должен выглядеть код по каждому пункту, без лишнего флуда.

#59 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 115 сообщений
Репутация: 285

Отправлено 11 Январь 2020 - 07:03

Просмотр сообщенияdim81 (06 Январь 2020 - 18:24) писал:

Здравствуйте, с наступившем НГ!

У меня назрел очень актуальный вопрос по промежуточным переменным.
ПРИМЕРЫ:
Вот учебный код:
public $db;

public function __construct($host,$user,$pass,$db) {
$this->db = mysql_connect($host,$user,$pass);
if(!$this->db) {
exit('No connection with database');
}
if(!mysql_select_db($db,$this->db)) {
exit('No table');
}

mysql_query("SET NAMES cp1251");

return $this->db;
}
Вот мой код:
public function __construct($host,$user,$pass,$db){

if(!$con = mysql_connect($host,$user,$pass)){
exit('not m_connect');
}

if(!mysql_select_db($db,$con)){
exit('not m_select_db');
}

mysql_query('SET NAMES cp1251');

}
Вот упрощенный код, когда мы уже что-то вывели и убедились, что все работает:
public function __construct($host,$user,$pass,$db){

$con = mysql_connect($host,$user,$pass)

mysql_select_db($db,$con);

mysql_query('SET NAMES cp1251');

}

ВОПРОСЫ:
1. В учебном коде мы заносим соединение БД $this->db = mysql_connect($host,$user,$pass);в свойство,
а mysql_select_db($db,$this->db) в свойство не заносим, вопрос почему?
2. Всегда ли необходимо использовать промежуточные переменные или они больше для наглядности кода?
3. Если я сокращаю код, как в примерах выше или ниже, я экономлю память или создание промежуточной переменной на экономию памяти не влияет?
- можно так:
$sql = "SELECT id,title,description FROM statti";
$res = mysql_query($sql);

- а можно так:
$res = mysql_query("SELECT id,title,description FROM statti");
Последний пример более короткий и используется одна промежуточная переменная вместо двух.

4. Обязательно ли метод __construct в примере выше должен возвращать - return отработку метода? Вроде он как автоматический и при создании класса он и так производит свою отработку.

СПАСИБО!
Здравствуйте!
Что касается переменных, то как правило они испльзуется в том случе, если значение, которое сохраняется в переменной, будет использоваться несколько раз в проекте. Если же значение используется единоразово, то переменную можно не сохранять.
По поводу функций по работе с базой данных, расширение mysql уже устарело и вместо него необходимо использовать mysqli или PDO.
Любое сокращение кода, если это не влияет на функциональность - это всегда хорошо.

#60 dim81

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 66 сообщений
Репутация: 0

Отправлено 13 Январь 2020 - 15:59

Просмотр сообщенияMeits (11 Январь 2020 - 07:03) писал:

Здравствуйте!
Что касается переменных, то как правило они испльзуется в том случе, если значение, которое сохраняется в переменной, будет использоваться несколько раз в проекте. Если же значение используется единоразово, то переменную можно не сохранять.
По поводу функций по работе с базой данных, расширение mysql уже устарело и вместо него необходимо использовать mysqli или PDO.
Любое сокращение кода, если это не влияет на функциональность - это всегда хорошо.

Спасибо за развернутый ответ! Все логично.

Сообщение отредактировал dim81: 13 Январь 2020 - 16:00






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных