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


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

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

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

#21 Meits

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

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

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

Просмотр сообщенияdim81 (05 Ноябрь 2019 - 09:15) писал:

Спасибо большое, Вот это место:
if(!empty($url[0])){
$this->controller = ucfirst($url[0]).'_Controller';
}
else{
$this->controller = "Index_Controller";
}
...Ну а метод request у страниц мы вызываем через класс Base, а тот в свою очередь получает его из основного абстрактного класса Base_Controller
Пожалуйста!
Да, метод через наследование доступен в каждом контроллере.

#22 dim81

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

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

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

Виктор, здравствуйте!

1 Вопрос: Правильно ли я понимаю, что мы в одно и тоже свойство можем "запихнуть" и запрос соединения БД, и ошибку соединения и кодировку, код привожу ниже:

$this->ins_db = new mysqli(HOST,USER,PASSWORD,DB_NAME);

if($this->ins_db->connect_errno){

throw new DbExeption ("Ошибка соединения: ".$this->ins_db->connect_error." ".$this->ins_db->connect_errno);
}
$this->ins_db->query("SET NAMES 'UTF8'");

Как-то немного непривычно, поскольку свойство я предполагал как одну ячейку для хранения информации, до этого в контроллере мы все логично делали, в здесь в модели я задумался.

2. Вопрос. То есть, правильно ли я понимаю, что мы можем не только хранить в свойстве какие-то данные, но и обращаться через это свойство к какому-то методу одновременно? Так мне об этом говорят данные в конструкторе - мы обращаемся при любой процедуре к $this->ins_db;

Или это исключение для соединения?? Тут и объекты мы используем, у которых нет классов, это видимо исключение для языка SQLI.

Спасибо!

#23 Meits

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

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

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

Просмотр сообщенияdim81 (09 Ноябрь 2019 - 20:40) писал:

Виктор, здравствуйте!

1 Вопрос: Правильно ли я понимаю, что мы в одно и тоже свойство можем "запихнуть" и запрос соединения БД, и ошибку соединения и кодировку, код привожу ниже:

$this->ins_db = new mysqli(HOST,USER,PASSWORD,DB_NAME);

if($this->ins_db->connect_errno){

throw new DbExeption ("Ошибка соединения: ".$this->ins_db->connect_error." ".$this->ins_db->connect_errno);
}
$this->ins_db->query("SET NAMES 'UTF8'");

Как-то немного непривычно, поскольку свойство я предполагал как одну ячейку для хранения информации, до этого в контроллере мы все логично делали, в здесь в модели я задумался.

2. Вопрос. То есть, правильно ли я понимаю, что мы можем не только хранить в свойстве какие-то данные, но и обращаться через это свойство к какому-то методу одновременно? Так мне об этом говорят данные в конструкторе - мы обращаемся при любой процедуре к $this->ins_db;

Или это исключение для соединения?? Тут и объекты мы используем, у которых нет классов, это видимо исключение для языка SQLI.

Спасибо!
По первому вопросу как то не понял что Вы имеете ввиду. Свойство - как переменная, в него можно сохранить все что угодно. Но в примере выше, используется два разных свойства. Внимательно посмотрите:
$this->ins_db->connect_error
$this->ins_db->connect_errno
А сам объект подключения, содержится в
$this->ins_db
Второй вопрос мне тоже не очень понятен. В свойстве мы можем хранить как простые данные, так и сложные, к примеру объекты классов Если хранится объект класса, то у него можно вызываеть методы и обращаться к его свойствам

#24 dim81

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

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

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

Цитата

Второй вопрос мне тоже не очень понятен. В свойстве мы можем хранить как простые данные, так и сложные, к примеру объекты классов Если хранится объект класса, то у него можно вызываеть методы и обращаться к его свойствам
- это все понятно

Вопрос в том, что мы в одно и тоже свойство, которое мы объявили: public $ins_db; теперь обращаемся $this->ins_db - и кладем в него все, что захотим:

- new mysqli(HOST,USER,PASSWORD,DB_NAME);
- connect_errno
- connect_error
- query("SET NAMES 'UTF8'");

Поэтому и возникли 2 вопроса выше. То есть я потерял логику, поскольку мы должны либо положить что-то в свойство, либо вызвать метод, а получается что мы в одно свойство public $ins_db; кладем и инфо по ошибкам и соединение и установку кодировки.

Или здесь другая логика???

#25 Meits

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

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

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

Просмотр сообщенияdim81 (11 Ноябрь 2019 - 14:09) писал:

- это все понятно

Вопрос в том, что мы в одно и тоже свойство, которое мы объявили: public $ins_db; теперь обращаемся $this->ins_db - и кладем в него все, что захотим:

- new mysqli(HOST,USER,PASSWORD,DB_NAME);
- connect_errno
- connect_error
- query("SET NAMES 'UTF8'");

Поэтому и возникли 2 вопроса выше. То есть я потерял логику, поскольку мы должны либо положить что-то в свойство, либо вызвать метод, а получается что мы в одно свойство public $ins_db; кладем и инфо по ошибкам и соединение и установку кодировки.

Или здесь другая логика???
В свойство $this->ins_db мы кладем объект, а у этого объекта есть свои собственные свойста, которые отдельно вызываются. Так же у него могут быть методы.
- connect_errno - это свойство объекта - $this->ins_db

#26 dim81

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

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

Отправлено 11 Ноябрь 2019 - 20:51

тогда, если я правильно понял, этот объект new mysqliбез класса как исключение, поскольку обращаемся к БД и для БД мы класс не писали.

Просто для меня как новичка это немного новый подход))), я и написал выше, что до этого все логично мы в контроллере делали, а здесь появилась как бы еще одна логика, в принципе, тоже понятная, надо теперь просто запомнить это.

#27 Meits

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

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

Отправлено 11 Ноябрь 2019 - 21:36

Просмотр сообщенияdim81 (11 Ноябрь 2019 - 20:51) писал:

тогда, если я правильно понял, этот объект new mysqliбез класса как исключение, поскольку обращаемся к БД и для БД мы класс не писали.

Просто для меня как новичка это немного новый подход))), я и написал выше, что до этого все логично мы в контроллере делали, а здесь появилась как бы еще одна логика, в принципе, тоже понятная, надо теперь просто запомнить это.
Mysqli это стандартный класс php


#28 dim81

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

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

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

просто, мы не описывали его как привичные классы - Base, Base_Controller

тогда получается запись следующего вида new mysqli (HOST,USER,PASSWORD,DB_NAME); говорит нам что это класс, а объект класса - new mysqli

Правильно?

#29 Meits

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

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

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

Просмотр сообщенияdim81 (12 Ноябрь 2019 - 08:32) писал:

просто, мы не описывали его как привичные классы - Base, Base_Controller

тогда получается запись следующего вида new mysqli (HOST,USER,PASSWORD,DB_NAME); говорит нам что это класс, а объект класса - new mysqli

Правильно?
Его не нужно описывать. Повторюсь, это стандартный класс языка PHP. Его уже за нас описали)

#30 dim81

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

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

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

я просто все догадками, а вы мне все подтвердили. Спасибо Вам большое за обратную связь и поддержку! Теперь все ясно.

#31 dim81

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

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

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

Здравствуйте, Виктор!
Подскажите, плиз. В модели в конце мы запускаем цикл на исполнение:

for($i=0; $i<$result->num_rows;$i++){

$row[ ] = $result->fetch_assoc();
}
return $row;
А в версии php 7 уже не поддерживаются пустые скобки, если я указываю в скобках 0, то выводится только одна строка, если помещаю конструкцию так:
$arr = array($result->fetch_assoc()) ;

тоже одна строка выводится

Вопрос:
- Какой должен быть правильный синтаксис для php7
- Как его написать?

Спасибо!

#32 Meits

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

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

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

Просмотр сообщенияdim81 (13 Ноябрь 2019 - 09:32) писал:

Здравствуйте, Виктор!
Подскажите, плиз. В модели в конце мы запускаем цикл на исполнение:

for($i=0; $i<$result->num_rows;$i++){

$row[ ] = $result->fetch_assoc();
}
return $row;
А в версии php 7 уже не поддерживаются пустые скобки, если я указываю в скобках 0, то выводится только одна строка, если помещаю конструкцию так:
$arr = array($result->fetch_assoc()) ;

тоже одна строка выводится

Вопрос:
- Какой должен быть правильный синтаксис для php7
- Как его написать?

Спасибо!
Здравствуйте!
Оператор пустые скобки поддерживается в PHP7 - скорее всего у Вас где то ошибка. Возможно пробел между скобкми

#33 dim81

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

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

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

Здравствуйте, Виктор!

Мне, как новичку, очень будет важно ваше пояснение:
-------------
1 ПРИМЕР: Класс Model_Driver заканчивается циклом:

for($i = 0; $i < $result->num_rows; $i++){
$row[] = $result->fetch_assoc();
}
return $row;

1. Вопрос: Но, массив $row[] должен быть явно приравнен к массиву и объявлен над циклом for: $row = array(); а в примере 1 этого нет.
-------------
2. ПРИМЕР: Я обратил внимание, что в файле Base_Controller, когда мы описываем функцию init, мы тоже опускаем этот момент и не указываем над циклом пустой массив, хотя у нас присутствует $this->styles[] - вот часть этого кода:

global $conf;

if(isset($conf['styles'])){
foreach($conf['styles'] as $style){
$this->styles[] = trim($style,'/');
}
}

2. Вопрос: Как мне понять, когда я должен явно указывать пустой массив над циклом вида $row = array(), а когда нет?
-------------
Спасибо большое!

#34 Meits

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

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

Отправлено 19 Ноябрь 2019 - 07:01

Просмотр сообщенияdim81 (18 Ноябрь 2019 - 14:13) писал:

Здравствуйте, Виктор!

Мне, как новичку, очень будет важно ваше пояснение:
-------------
1 ПРИМЕР: Класс Model_Driver заканчивается циклом:

for($i = 0; $i < $result->num_rows; $i++){
$row[] = $result->fetch_assoc();
}
return $row;

1. Вопрос: Но, массив $row[] должен быть явно приравнен к массиву и объявлен над циклом for: $row = array(); а в примере 1 этого нет.
-------------
2. ПРИМЕР: Я обратил внимание, что в файле Base_Controller, когда мы описываем функцию init, мы тоже опускаем этот момент и не указываем над циклом пустой массив, хотя у нас присутствует $this->styles[] - вот часть этого кода:

global $conf;

if(isset($conf['styles'])){
foreach($conf['styles'] as $style){
$this->styles[] = trim($style,'/');
}
}

2. Вопрос: Как мне понять, когда я должен явно указывать пустой массив над циклом вида $row = array(), а когда нет?
-------------
Спасибо большое!
Здравствуйте!
Вообще, по хорошему, желательно всегда объявлять переменную и определять ее дефолтное значение до выполнения каких либо действий. Но если этого не сделали, то ошибки не будет.

#35 dim81

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

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

Отправлено 19 Ноябрь 2019 - 07:48

Спасибо за комментарий!

А в ПРИМЕРЕ 2, то есть перед foreach я должен объявить что-то такое:


if(isset($conf['styles'])){

$this->styles[] = array(); [color=#008000]//Такой будет синтаксис? Квадратные скобки здесь надо указывать?[/color]

foreach($conf['styles'] as $style){
$this->styles[] = trim($style,'/');
}
}



#36 Я.Сергей

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

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

Отправлено 19 Ноябрь 2019 - 07:53

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

правильный синтаксис такой
$this->styles = array();  // классический способ объявления массива
$this->styles = []; // в современных версиях php (начиная с 5.6) можно объявить массив так, т.е. (просто указав пустые квадратные скобки)

в вашем примере (указав квадратные скобки) вы создаёте первый элемент массива и помещаете в него другой пустой массив

#37 dim81

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

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

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

Спасибо!
классический способ наглядней - да, я понял, нет смысла указывать [] если мы итак явно приравняли свойство к массиву.
-----------------
Еще вопрос:
В мануале php начиная с php 7.1.0 Создание/модификация с помощью синтаксиса квадратных скобок
есть ЗАМЕЧАНИЕ: пустой индекс приведет к фатальной ошибке - см. здесь.

Посмотрите плиз, поскольку очень для меня размыто, что имеется ввиду?

Спасибо.

#38 Meits

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

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

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

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

Спасибо!
классический способ наглядней - да, я понял, нет смысла указывать [] если мы итак явно приравняли свойство к массиву.
-----------------
Еще вопрос:
В мануале php начиная с php 7.1.0 Создание/модификация с помощью синтаксиса квадратных скобок
есть ЗАМЕЧАНИЕ: пустой индекс приведет к фатальной ошибке - см. здесь.

Посмотрите плиз, поскольку очень для меня размыто, что имеется ввиду?

Спасибо.
Скорее всего имеется ввиду когда оператор применяется не к массиву а к строке. То есть строка это не массив и без явной коныертации использовать нельзя

#39 dim81

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

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

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

Спасибо Вам!

#40 Meits

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

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

Отправлено 20 Ноябрь 2019 - 07:50

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

Спасибо Вам!
Пожалуйста





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

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