Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Заблокирован
1

Что я тут получаю?

24.02.2020, 15:16. Показов 327. Ответов 15

Author24 — интернет-сервис помощи студентам
PHP
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
class User extends Model
{
    private $session_uid;
    private $uid;
    
    public function __construct($uid = null)
    {
        parent::__construct();
        $this->session_uid = $_SESSION['uid'] ?? null;
        $this->uid = $uid ?? $this->session_uid;
    }
 
    public function getUser()
    {
        return $this->pdo('select * from users where id = ? limit 1', [
            $this->uid
        ])->fetchObject(__CLASS__);
    }
}
 
class Main extends Model
{
    public $user;
 
    public function __construct()
    {
        parent::__construct();
        $mOdj = new User();
        $this->user = $mOdj->getUser();
    }
}
В $this->user у меня результат выборки из БД или экземпляр класса User с параметрами, автоматически заполненными из БД?

Добавлено через 20 минут
То есть нужно ли дополнительно объявить для класса User свойства, соответствующие столбцам в БД, чтобы обращаться к ним, работать с ними ВНУТРИ КЛАССА User (не Main)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2020, 15:16
Ответы с готовыми решениями:

Empty(var) получаю не то что хочу
Всем привет, есть у меня массив $termTypes; // я его в цикле прокручиваю и получаю либо...

Что значит это условие? Немогу расчехлить на что тут идёт проверка!!!
НЕмогу понять на что идет проверка. if monthof(DateTimePicker1.date+33)<9 then...

Можете на псевдокоде объяснить, что тут за что отвечает?
class Count{ public static void main(String args){ int a, b; boolean isPrime; for(a =...

Что тут нужно поменять что бы код работал?
Дано предложения: "ЛЕНЬ - МАТЬ ВСЕХ ПОРОКОВ" В заданном предложении вырезать каждую третью букву...

15
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
24.02.2020, 20:55 2
что у меня в $this->user
- удивительно, что об этом спрашивает сам автор скрипта
если вопрос для вас еще актуален, то что это у вас такое можно узнать с помощью простой отладки
PHP
1
2
3
4
$main = new Main();
echo '<pre>';
print_r($main);
echo '</pre>';
сам результат выборки я угадывать не буду, потому что вы не показали код метода pdo класса user. если же он возвращает то же, что и pdo->prepare, тогда он возвращает экземпляр user с соответствующими полями. только смотрите, чтобы в user не было полей, совпадающими с полями таблицы users - иначе они будут заполнены данными из этой таблицы, независимо от того - public они или private. заранее их объявлять специально для объекта из pdo stmt не обязательно.
0
Заблокирован
24.02.2020, 21:39  [ТС] 3
Цитата Сообщение от vinikon Посмотреть сообщение
заранее их объявлять специально для объекта из pdo stmt не обязательно
Как мне тогда с ними работать ВНУТРИ КЛАССА User (не Main)?

Я ведь сделал автозаполнение, правильно? У меня в $this->user содержится класс User со свойствами, следовательно я могу ВНУТРИ класса User создать какой-то метод, где использую $this->id, хотя свойство не объявлено - оно ведь заполнится автоматически?
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
24.02.2020, 22:11 4
внутри класса user вы c ними сможете работать, если только заранее все их объявите как private, то есть для каждого поля таблицы users в классе user вы объявляете соответствующее поле private $field; после запроса они заполняются соответствующими данными. вы реализуете интерфейс работы с ними в классе user (там через геттеры / сеттеры, например) только зачем вам это надо? в вышеприведенном примере вы можете так обратиться к данным класса user внутри класса main:
PHP
1
2
3
4
5
6
7
8
class Main
{
.....
public function user($prop)
{
return $this->user->$prop;
}
}
и вывести, например id юзера: echo $main->user('id')

Добавлено через 7 минут
если же не объявлять их private, то можно прямо к ним обращаться
PHP
1
2
$user = new User(12);
echo $user->id;
0
Заблокирован
24.02.2020, 22:17  [ТС] 5
Цитата Сообщение от vinikon Посмотреть сообщение
если же не объявлять их private
ну-ну

Цитата Сообщение от vinikon Посмотреть сообщение
только зачем вам это надо?
чтобы заполнить свойства запросом из БД и использовать свойства ВНУТРИ класса, в котором выполнено автозаполнение
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
24.02.2020, 22:34 6
то есть вы считаете, что внутри класса вы можете использовать только private свойства?
0
Заблокирован
24.02.2020, 22:43  [ТС] 7
я ничего не считаю, я вопрос задал: нужно ли объявлять свойства для класса, в котором происходит автозаполнение свойств, если ВНУТРИ этого класса есть методы, использующие эти свойства
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
24.02.2020, 22:49 8
возможно, скоро появится новая тема: "Почему неправильно работает класс User"
0
Заблокирован
25.02.2020, 01:52  [ТС] 9
vinikon, возможно появится, если Вы неправильно ответите на этот вопрос

Добавлено через 5 минут
vinikon, я Вам разложу по полочкам

PHP
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
class User extends Model
{
    public function getUser()
    {
        return $this->pdo('select * from users where id = ? limit 1', [
            1
        ])->fetchObject(__CLASS__);
    }
 
    public function test()
    {
        return $this->id;
    }
}
 
class Main extends Model
{
    public $user;
 
    public function __construct()
    {
        parent::__construct();
        $mOdj = new User();
        $this->user = $mOdj->getUser();
        echo $this->user->test(); // Что мы тут имеем?
        }
}
Вопрос в комментарии к коду.
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
25.02.2020, 11:47 10
уважаемый, вы бы себе сначала разложили по полочкам. смотрите, что вы делаете. класс user наследует от model, класс main наследует от model. какой смысл создавать класс main для работы с классом user, если они совершенно равноценные наследники? иными словами все методы, какие там планировались для класса main можно спокойно добавить в user, и не городить огород из непонятных наследников. использование метода getUser c возвратом значения за пределы класса нарушает основной принцип ооп-инкапсуляцию свойств и методов объекта. в-общем класс user я бы сбацал как это все обычно делают:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class User extends Model
{
    protected $session_uid;
    protected $uid;
    protected $config = null;
    public function __construct($uid = null)
    {
        parent::__construct();
        $this->session_uid = $_SESSION['uid'] ?? null;
        $this->uid = $uid ?? $this->session_uid;
        return $this->getUser();
    } 
    protected function getUser()
    {
        // метод pdo у вас где-то определен
        $this->config = $this->pdo('select * from users where id = ? limit 1', 
            [$this->uid])->fetchObject(__CLASS__);
        return true;
    }
    public function __get($prop)
    {
          return property_exists($this->config->$prop) ? $this->config->$prop : null;
    }
}
и обращаетесь к этому свойству в методах класса $this->id; а в объектах так же
PHP
1
2
$user = new User(12);
echo $user->id;
Добавлено через 1 минуту
класс main с этой точки зрения совершенно не нужен

Добавлено через 7 минут
нет, с возвратом результата выборки из бд в виде класса бредовая идея. лучше сделать так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class User extends Model
{
    protected $session_uid;
    protected $uid;
    protected $config = [];
    public function __construct($uid = null)
    {
        parent::__construct();
        $this->session_uid = $_SESSION['uid'] ?? null;
        $this->uid = $uid ?? $this->session_uid;
        return $this->getUser();
    } 
    protected function getUser()
    {
        // метод pdo у вас где-то определен
        $this->config = $this->pdo('select * from users where id = ? limit 1', 
            [$this->uid])->fetch(PDO::FETCH_ASSOC);
        return true;
    }
    public function __get($prop)
    {
          return isset($this->config[$prop]) ? $this->config[$prop] : null;
    }
}
0
Заблокирован
25.02.2020, 11:52  [ТС] 11
vinikon,

return метода в конструкторе (который ещё и зацикливание вызовет скорее всего) - чушь полная, конструктор ничего не возвращает - VOID

метод с запросом без возврата объекта (а чё, для получения объекта с данными ведь достаточно вернуть булев)

для полной картины добавим немного магии __get()

это прям великолепно

Цитата Сообщение от vinikon Посмотреть сообщение
класс main с этой точки зрения совершенно не нужен
в классе Main вообще-то нужно создать экземпляр класса User, автоматически заполнить запросом там свойства, вопрос: доступны ли эти автоматически заполненные свойства для методов класса User?
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
25.02.2020, 12:02 12
да, а о чем вы спрашивали
Цитата Сообщение от Verolomstvo Посмотреть сообщение
нужно ли дополнительно объявить для класса User свойства, соответствующие столбцам в БД
то сами рассудите: сейчас у вас такая конфигурация аккаунта, вдруг понадобится добавить еще одно свойство пользователя - и придется заново редактировать скрипты с полями в user. это неправильно. тут надо по другому сделать. обычно создается конфигурационный файл в виде массива с названиями полей и правилами их валидации. во время создания объекта он загружается и используется для работы с соответствующей таблицей бд. если надо добавить поле - добавляется в файл конфига ключ=названию поля, указывающий на правила валидации этого поля. а скрипты не меняются

Добавлено через 2 минуты
Цитата Сообщение от Verolomstvo Посмотреть сообщение
вопрос: доступны ли эти автоматически заполненные свойства для методов класса User?
вот проверьте и узнаете. я в принципе отвечал не сколько для вас, а для тех, кто еще заглянет в эту тему - может кому-то пригодится
0
Заблокирован
25.02.2020, 12:06  [ТС] 13
vinikon, Вы вопрос вообще не поняли
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
25.02.2020, 12:08 14
переведите
0
Заблокирован
25.02.2020, 12:10  [ТС] 15
Цитата Сообщение от vinikon Посмотреть сообщение
вот проверьте и узнаете
а Вы зачем тут отсвечиваете, чтобы return из конструктора делать

Цитата Сообщение от vinikon Посмотреть сообщение
для тех, кто еще заглянет в эту тему - может кому-то пригодится
млять ну не знаешь, так не лезь в тему
0
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
25.02.2020, 12:13 16
спасибо за перевод, мешать не буду
0
25.02.2020, 12:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2020, 12:13
Помогаю со студенческими работами здесь

Что тут метод, а что конструктор?
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

ADO и Oracle, получаю в ответ, что у меня устаревшее OLE DB
Использую в ASP ADO-соединение через MSDAORA для Oracle. Получаю в ответ, что у меня устаревшее OLE...

Что- то тут не то
есть 2 метода: 1 с командами другой после определённой команды должен вывести есть ли файл или нет,...

Что делать? Ставлю на ссд винду и тут вот это, я думаю что ссд полетел
Мерцает экран при загрузке Виндоус, и дальше не загружается так и мерцает, это наверное полетел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru