133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
1

Что здесь не правильно с точки зрения ООП

01.09.2016, 17:46. Показов 1620. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Делаю себе классы для авторизация через разные соц.сети (в сети есть решения)Но мне не нужен чужой велосипед.
Я хочу свое, ибо так я изучаю и вникаю в ООП , пока сам не напишу не вникаю в чужое.

Я большую часть своих классов пишу с использование private\public - static
Часто использую статические методы.На сколько это дурной подход??

Просто если без использования статики, я не могу например сохранить в $appID какое то значение , что бы потом внутри класса мог к нему обратиться и взять оттуда что мне надо.
Поэтому я использую статику, т.к он мне позволяет это сделать.
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 VKoAuth {
 
        private $appID;
 
        private $secret_key;
        
        private $redirect_uri;
 
        private $url_acess_token;
 
        private static $url_auth;
 
        private $access_token;
 
        public function __construct($appID,$secret_key,$redirect_uri = 'index.php',$url_auth = 'https://oauth.vk.com/authorize'){
            $this->$appID           = $appID;
            $this->$secret_key      = $secret_key;
            $this->$redirect_uri    = $redirect_uri;
            self::$url_auth     = $url_auth;
        }
 
        public static function auth($access='offline',$response_type = 'code'){
            echo self::$url_auth;
            // $url = $this->url_auth.'?client_id='.$this->appID
            //                    .'&scope='.$access
            //                    .'&redirect_uri='.$this->redirect_uri
            //                    .'&response_type='.$response_type;
            // return $url;
        }
 
    }
Добавлено через 41 минуту
А не я немного ошибся, у меня тут public static function auth статический метод, поэтому я не мог использовать то что в комментариях.
Но все равно , хочу услышать на сколько это неверно
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2016, 17:46
Ответы с готовыми решениями:

Как вынести определённый механизм в отдельный класс и затем обращаться к нему и правильно ли это с точки зрения ООП
Как вынести определённый механизм в отдельный класс и затем обращаться к нему и правильно ли это с...

Программа с точки зрения ООП
Есть вопрос, на который однозначного ответа у меня пока что нет. Прошу помощи в разборе полетов...

C# правильность кода с точки зрения ООП
Написал программу для хранения и обработки дерева в БД. Каждая кнопка имеет свой обработчик,...

Оценить код с точки зрения принципов ООП и корректность в целом
Извиняюсь заранее, если не в ту тему не с той просьбой. Прошу посмотреть код, оценить его с точки...

25
Max Dark
01.09.2016, 18:13
  #2

Не по теме:

Для сборки URL лучше использовать функцию http_build_query
Пример для вашего кода

PHP
1
2
3
4
5
6
7
8
9
<?php
 
$query = http_build_query([
    'client_id' => $this->appID,
    'scope' => $access,
    'redirect_uri' => $this->redirect_uri,
    'response_type' => $response_type, 
]);
$url = $this->url_auth.'?'.$query;

0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.09.2016, 18:15  [ТС] 3
Cra3y, Об этой фукнции я знаю, но пока она мне не нужна.
спасибо конечно, Но я бы хотел комментарии по коду и по конкретному моему вопросу, про статические методы , плохо и почему ли?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
01.09.2016, 19:37 4
В чём необходимость объявления метода auth статичным? По-моему, нет необходимости. Тем более, что он обращается к свойству, значение которого устанавливается при создании объекта.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.09.2016, 19:40  [ТС] 5
Para bellum, Это я каюсь, я ошибся, привычка уже вырабатывается писать static
Вот и спрашиваю насколько это ужасно и плохо?
Я бы тоже не отказался бы от статьи где подробно бы объяснили в каких ситуациях использовать static методы.Ну или человеческим языком

Пытаюсь читать книги по ООП , но не нахожу Понятного для меня объяснения , в каких случаях использовать static, protected , ....
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
01.09.2016, 20:02 6
Цитата Сообщение от maruo Посмотреть сообщение
Вот и спрашиваю насколько это ужасно и плохо?
Это можно понять по:
Цитата Сообщение от maruo Посмотреть сообщение
у меня тут public static function auth статический метод, поэтому я не мог использовать то что в комментариях.
Раз вы не можете из-за этого нормально использовать класс, значит надо обычный метод использовать.

static принадлежит классу, а не объекту, из этого и исходим.
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
01.09.2016, 20:05 7
Цитата Сообщение от maruo Посмотреть сообщение
Я бы тоже не отказался бы от статьи где подробно бы объяснили в каких ситуациях использовать static методы.
https://habrahabr.ru/post/169301/
1
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.09.2016, 20:25  [ТС] 8
А можно вопрос по этому? я встречал где то в кодах, чужих, это типо класс пишет перед параметром.
Как это называется и где почитать
Я про это Database $database в параметрах конструктора
PHP
1
2
3
public function __construct(Database $database) {
       $this->database = $database;
   }
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,260
Записей в блоге: 7
01.09.2016, 20:29 9
Цитата Сообщение от maruo Посмотреть сообщение
Как это называется и где почитать
Внедрение зависимостей(Dependency injection)
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.09.2016, 20:42  [ТС] 10
Cra3y, Это что получается Что мы в свойство класса можем положить объект другого класса и обращаться к нему из текущего ? для этого паттерн внедрение зависимостей?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
01.09.2016, 20:50 11
Цитата Сообщение от maruo Посмотреть сообщение
Как это называется и где почитать
Я про это Database $database в параметрах конструктора
Указывает, что в эту переменную можно передать только объект класса Database.

Аналогично работает function test(array $data) - можно передать только массив (к сожалению, допустимо только для объектов и массивов, для других типов данных не работает).
2
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.09.2016, 20:55 12
(к сожалению, допустимо только для объектов и массивов, для других типов данных не работает).
Начиная с версии 7.0 работает
1
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.09.2016, 21:00  [ТС] 13
Jodah, А ну помню помню, я когда то экспериментировал писал туда типы данных, и у меня не работало кроме array().
Jewbacabra, Это хорошо, т.к я последнее время в основной сижу на 7 версии.
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,260
Записей в блоге: 7
01.09.2016, 21:08 14
Цитата Сообщение от maruo Посмотреть сообщение
для этого паттерн внедрение зависимостей?
Нет.
Внедрение зависимостей упрощает замену реализаций компонентов.
В общем смысл в том что мы объявляем интерфейс(список методов которые нам требуются), а реализации предоставляют этот интерфейс и их(реализаций) может быть много.
При создании объекта мы передаем объект, реализующий данный интерфейс

Не по теме:

Честно говоря, я не знаю как это объяснить по простому - сам до конца еще не въехал :D

1
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
01.09.2016, 21:09 15
Jewbacabra, ооо, точно, нашёл в документации, спасибо!
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
02.09.2016, 06:37 16
Цитата Сообщение от maruo Посмотреть сообщение
Как это называется и где почитать
Это называется type hints. В принципе, Вам ответили, для чего это. Говорю для того, чтобы в поисковике запрос могли задать правильный, если более подробно нужно будет изучить.

Добавлено через 9 минут
Вот тут подробнее: http://php.net/manual/ru/langu... inting.php
Там написано:
Контроль типа не может быть использован со скалярными типами, такими как int или string.
Но для седьмой версии это неактуально.
1
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.09.2016, 12:02  [ТС] 17
Para bellum, я понял уже , особо не вижу пока задач где это нужно
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
02.09.2016, 13:27 18
Цитата Сообщение от maruo Посмотреть сообщение
особо не вижу пока задач где это нужно
Это очень полезная вещь и много где нужна. Нет, можно и без неё, конечно. Но тогда приложение будет работать в режиме "бог не выдаст -- свинья не съест".
0
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
07.09.2016, 07:20 19
Цитата Сообщение от Para bellum Посмотреть сообщение
Это очень полезная вещь и много где нужна.
А можно конкретней, так сказать с примерами?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
07.09.2016, 07:41 20
Цитата Сообщение от Gcom Посмотреть сообщение
А можно конкретней, так сказать с примерами?
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
32
33
34
35
36
<?php
    class User {
        public function getBalance(){
            return 100;
        }
    }
    
    class Auto {}
    
    class Example {
        private $users;
        
        public function addUser(User $user){
            $this->users[] = $user;
        }
        
        public function getSumBalance(){
            $sum = 0;
            
            foreach($this->users as $user)
                $sum += $user->getBalance();
            
            return $sum;
        }
    }
    
    $example = new Example;
    
    # Тут всё нормально
    $example->addUser(new User);
 
    # А тут будет ошибка, если раскомментировать
    # $example->addUser(new Auto);
    
    # Выводим сумму счетов
    echo $example->getSumBalance();
Усложнять интерфейсами и абстрактными классами не стал. Но давайте допустим, что в классе User гарантированно есть метод getBalance.
Таким образом, уточняя тип в методе addUser, мы знаем, что метод getSumBalance будет оперировать исключительно с объектами пользователей, в которых точно есть метод getBalance. Значит, никаких ошибок не возникнет.

Теперь посмотрим, что будет, если не уточнять тип и положиться на "ну, и так ясно, что туда нужно только объекты 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
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
    class User {
        public function getBalance(){
            return 100;
        }
    }
    
    class Auto {}
    
    class Example {
        private $users;
        
        public function addUser($user){
            $this->users[] = $user;
        }
        
        public function getSumBalance(){
            $sum = 0;
            
            foreach($this->users as $user)
                $sum += $user->getBalance();
            
            return $sum;
        }
    }
    
    $example = new Example;
    
    # Тут всё нормально
    $example->addUser(new User);
 
    # О, нет ошибки
    $example->addUser(new Auto);
    
    # Выводим сумму счетов
    # И будет ошибка, потому что в классе Auto нет метода getBalance
    echo $example->getSumBalance();
А вот кто-то взял, да не то добавил. Будет ошибка.
1
07.09.2016, 07:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2016, 07:41
Помогаю со студенческими работами здесь

Если два метода выполняют одно и то же - с точки зрения программы, но разное - с точки зрения логики?
void killCh(BCell cKiller, BCell cVictim){ cVictim.setChessman(cKiller.getChessman()); ...

Правильно ли составлены запросы с точки зрения безопасности?
Здравствуте! Не могли бы Вы сказать, так ли написаны запросы в бд, что бы не было возможности...

Как правильно сделать с точки зрения реляционных БД
В базе данных нужно создать поле тип оплаты, которое может принимать только два значения: &quot;нал&quot; или...

Правильно ли составлен текст программы с точки зрения синтаксиса
Привет всем! Я с Си вообще не сталкивалась, а тут пришлось транслятор с Си писать. Дана исходная...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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