Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
2 / 2 / 0
Регистрация: 20.12.2012
Сообщений: 52

MVC - правильное использование наследования

29.08.2013, 20:11. Показов 5748. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всім добрий день. Я намагаюсь розібратись з MVC і написати свій "велосипад"(фреймворк) - чисто для досвіду і щоб зрозуміти як це все працює. Знайшов в інтернеті статтю с файлами по цій темі(файли прикріпив).
Насколько я понял, из этой статьи, все контроллеры наследуются от базового контроллера.
Здесь и вопрос - что именно они должны наследовать. В файлах которые я прикрепил находится такой код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//любой контролер будет наследоваться от базового класса
 class Lib_BaseController 
 {
     private $member; 
        
     function __set($name,$val)
     {
         $this->member[$name] = $val;
     }
 
     function __get($name)
     {
          return $this->member; 
     }                   
 }
Но я не совсем понимаю что делают __set и __get.
Документацию по ним читал, но не совсем понимаю что они делают именно в этом примере.
Вложения
Тип файла: zip lesson1.zip (44.0 Кб, 4 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2013, 20:11
Ответы с готовыми решениями:

Правильное использование namespace
Есть проект на чистом PHP, по долгу стажировки так надо, для лучшего понимания. Проект я сделал без пространств имён, а для...

Сеттеры в PHP. Правильное использование
Новая статья: http://www.phpinfo.su/articles/theory/settery_v_php_pravilnoe_ispolzovanie.html жду критики )

Правильное использование пространства имен
Здравствуйте. Подскажите про пространство имен. К примеру у меня есть класс One, который относится к пространству имен A. Вопрос...

59
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 15:21
Студворк — интернет-сервис помощи студентам
Так опишите, еще не поздно. Пока я за полками бегаю.
Только не так пожалуйста
PHP
1
2
3
    public function __get($property) {
        return $this->$property;
    }
. Объяснить почему?

Добавлено через 3 минуты
Добавлено через 2 минуты
Эта статья не для вас http://www.phpinfo.su/articles... vanie.html
Какое отношение эта статья имеет к магическим сеттерам/геттерам?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 15:23
Цитата Сообщение от nubo Посмотреть сообщение
Объяснить почему?
объясните, вы же эксперт, куда мне. Только не надо про то, что свойства может не существовать - это я вам на протяжении двух страниц пытался сказать, вы этого не знаете. Другую причину объясните

Добавлено через 1 минуту
Цитата Сообщение от nubo Посмотреть сообщение
Какое отношение эта статья имеет к магическим сеттерам/геттерм?
совсем беда. Говорил же, статья не для вас
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 15:30
объясните, вы же эксперт, куда мне.
Зря вы ёрничаете. Все очень просто, такой геттер дает возможность обратиться к любому, даже приватному, свойству класса. Что автоматом отбрасывает принципы ООП к четвертой ветке PHP. А для чего тогда придумали уровни доступов?
совсем беда. Говорил же, статья не для вас
Эта статья действительно не для меня. Я там не нашел ничего нового, а про сеттеры тем паче. __call() никакого отношения к теме не имеет.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 15:36
Цитата Сообщение от nubo Посмотреть сообщение
__call() никкого отношения к теме не имеет.
серьезно? В данном случае тоже самое делает, по сути, является сеттером.
Цитата Сообщение от nubo Посмотреть сообщение
Зря вы ёрничаете
ну вы везде считаете, что лучше знаете, все аргументы отшиваете как "не нужно", "не правильно" и все время говорите о качестве моего кода. Я уж и не знаю, как к вам обращаться, то ли мастер, то ли эксперт, то ли экстрасенс. По нику ну просто не могу обращаться - вы же эксперт, это у меня ник неправильный просто
Цитата Сообщение от nubo Посмотреть сообщение
Что втоматом отбрасывает принципы ООП к четвертой ветке PHP. А для чего тогда придумали уровни доступов?
По-подробнее, пожалуйста. Значит, модификаторы доступа необходимы для разрешения/запрета только чтения значения?
В общем, вы тут поделитесь своим опытом с нубом (мной, конечно же), а я потом приду посме почитаю
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 15:46
ну вы везде считаете, что лучше знаете, все аргументы отшиваете как "не нужно", "не правильно" и все время говорите о качестве моего кода. Я уж и не знаю, как к вам обращаться, то ли мастер, то ли эксперт, то ли экстрасенс.
Обращайтесь ко мне просто... Бог. Ну а серьёзно, зачем так то. Не я начал, это вы обьявили:
Относительно же ваших знаний, по-крайней мере, в области ООП в php, можно судить уже хотя бы по этому сообщению MVC - правильное использование наследования
Я высказал свое мнение, а вы сделали вывод о мих знаниях. Чего теперь то удивляетесь ответной реакции?

Цитата Сообщение от KOPOJI Посмотреть сообщение
По-подробнее, пожалуйста.
Куда еще подробнее то...
PHP
1
2
3
4
5
6
7
8
9
10
<?php
class B {
    private $age = 18;
    public function __get($property) {
        return $this->$property;
    }
}
 
    $b = new B();
    echo 'Возраст: ', $b->age;
Если в классе есть такой геттер, совершенно не важно, какой уровень доступа установлен у свойств. Бери любое - нехочу. Это было, когда использовалась конструкция var, а значит мы откатили все завоевания PHP в этой чсти к 4-й ветке.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 15:51
Цитата Сообщение от nubo Посмотреть сообщение
Не я начал, это вы обьявили:
а вы посмотрите тот код, ссылку на который я давал (который вы написали). Как можно говорить, что свойство теперь установлено, если этого не сделано? И начал не я - вы говорили о том, "чьи мозги" я использую.
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 15:52
В данном случае тоже самое делает, по сути, является сеттером.
Почитайте сами внимательнее. Там нет магических сеттеров, а есть такие, какие как раз применяю я:
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
    public function setName($name) {
        $name = trim($name);
        if ($name == '') {
            throw new Exception('Не указано имя пользователя');
        }
        $this->name = $name;
 
        return $this;
    }
 
    public function setAge($age) {
        if (is_object($age) && $age instanceof Datetime) {
            $this->age = $age;
        } else {
            try {
                $age = new Datetime($age);
                $this->age = $age;
            } catch (Exception $e) {
                throw new Exception('Некорректный формат даты рождения пользователя');
            }
        }
        
        return $this;
    }
И вызываются так же, как у меня:
PHP
1
2
3
4
    $user->setName('Вася Иванов')
         ->setAge('18-08-1982')
         ->setSex('male')
         ->setHomepageUrl('http://www.phpinfo.su');
А вот метод __call() мы не обсуждали. Так что статья это на самом деле не для меня. Для вас.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 15:52
Цитата Сообщение от nubo Посмотреть сообщение
Это было, когда использовалась конструкция var, а значит мы откатили все завоевания PHP в этой чсти к 4-й ветке.
ну вот, опять. Позор разрабам, придумавшие никому ненужные геттеры и сеттеры
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 15:55
Позор разрабам, придумавшие никому ненужные геттеры и сеттеры
Все хорошо на своих местах. Доступ к закрытым свойствм класса - не цель магических сеттеров/геттеров. В других местах они полезны.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 16:06
Цитата Сообщение от nubo Посмотреть сообщение
Почитайте сами внимательнее. Там нет магических сеттеров, а есть такие, ккие как раз применяю я:
ууу, как все запущенно.. Special for you:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class User
{
    // Имя пользователя.
    protected $name;
    
    // Возраст пользователя.
    protected $age;
    
    // Пол пользователя.
    protected $sex;
 
    // URL домашней страницы пользователя.
    protected $homepage_url;
 
    public function __construct(){}
    
    /**
     * Получение и установка свойств объекта через вызов магического метода вида:
     * $object->(get|set)PropertyName($prop);
     *
     * @see __call
     * @return mixed
     */
    public function __call($method_name, $argument)
    {
        $args = preg_split('/(?<=\w)(?=[A-Z])/', $method_name);
        $action = array_shift($args);
        $property_name = strtolower(implode('_', $args));
 
        switch ($action)
        {
            case 'get':
                return isset($this->$property_name) ? $this->$property_name : null;
 
            case 'set':
                $this->$property_name = $argument[0];
                return $this;
        }
    }
    
    public function setName($name) {
        $name = trim($name);
        if ($name == '') {
            throw new Exception('Не указано имя пользователя');
        }
        $this->name = $name;
 
        return $this;
    }
 
    public function setAge($age) {
        if (is_object($age) && $age instanceof Datetime) {
            $this->age = $age;
        } else {
            try {
                $age = new Datetime($age);
                $this->age = $age;
            } catch (Exception $e) {
                throw new Exception('Некорректный формат даты рождения пользователя');
            }
        }
        
        return $this;
    }
 
    public function setSex($sex) {
        if (!in_array($sex, array('male', 'female'))) {
            throw new Exception('Неопределённый пол пользователя');
        }
        $this->sex = $sex;
        
        return $this;
    }
}
 
$user = new User();
$user->setName('Я не вижу того, что есть');
echo $user->getName();
Добавлено через 43 секунды
Цитата Сообщение от nubo Посмотреть сообщение
В других местах они полезны.
При проверке на существование? Ну да, че, как узко

Добавлено через 2 минуты
в общем, не вижу смысла что-то еще тут обсуждать. Надеюсь, код от таких экспертов, также, как и мой код к ним, никогда не попадут.
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 16:31
И что? Причем тут реализация __call()? Мы не обращаемся к свойствм напрямую, что предлагаете вы. А именно это ключевой момент. Я же говорил, что гораздо логичнее и прозрачнее использовать специальные сеттеры, не магические. Что мы и наблюдаем. Устанавливаем свойства мы не так:
PHP
1
$user->name = 'Вася Иванов';
Что было бы аналогично вашему
PHP
1
$b->age = 18;
А через сеттер, который четко указывает, что имеется ввиду:
PHP
1
$user->setName('Вася Иванов');
что аналогично моему
PHP
1
$b->setNumericAge(18);
Здесь тоже нужно объяснять разницу? Предвижу, что да.

Вызывая метод, мы явно и недвузначно понимаем, что производим конкретное действие. Устанавливаем свойство. Как реализовано это в классе, не важно, можно написть 30 сеттеров, можно так, как в статье, с помощью __call(), важно то, что мы не нарушаем принципов ООП. Мы попрежнему не можем обратиться к private свойству напрямую. Только через специальный для него сеттер. Ровно тоже самое с геттерами. Мы не можем получить значение свойства извне напрямую. Только через именной геттер.

Это прозрачно, функционально и красиво. Но причем тут мгические сеттеры/геттеры, в пятый раз спрашиваю?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 16:35
Цитата Сообщение от nubo Посмотреть сообщение
Здесь тоже нужно объяснять разницу?
сначала объясните, где происходит обращение напрямую к свойству извне класса при определении сеттера, а после объясните назначение сеттеров и геттеров вообще. Правда, мне беседа со стенкой неинтересна - объясняйте это разрабам php и других языков
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 17:03
Да хватит сливаться уже. Не интересно, ни кто не держит.
сначала объясните, где происходит обращение напрямую к свойству извне класса при определении сеттера
Снаружи. Снаружи класса, реализацию которого мы не видим в силу инкапсуляции. Вот это:
PHP
1
2
$b = new B;
$b->age = 18;
ни что иное, как обращение к свойству с целью его модификации. Мы не знаем, есть ли оно в классе, какой у него доступ. По вашей логике на это наплевать. Берем и модифицируем, чего стесняться.

А вот это:
PHP
1
2
$b = new B;
$b->setAge(18);
без комментариев ясно, что мы делаем.

Причем мы не можем получить значение свойства так:
PHP
1
2
$b = new B;
echo $b->var();
Если оно установлено в pronected или private или вообще. Кою вольность вы с легкостью себе позволяете, нарушая принцип инкапсуляции.

А вот геттером пожалуйста, если оно есть, это вполне оправдано и прозрачно:
PHP
1
2
$b = new B;
echo $b->getVar();
Мы четко видим, что производится конкретное действие. Если такой метод допустим, значит и допустимо обращение.

И это, я терпеливый. Я долго могу разговаривать со стенкой. Пока у неё аргументы не кончатся и она окончательно не сольется. Ну или не докажет мне обратное.

Добавлено через 8 минут
а после объясните назначение сеттеров и геттеров вообще.
Ну допустим для меня использование магических сеттеров оправдано только для дебаггинга. Есть еще один важный момент, но о нем принято стыдливо умалчивать. Это неверная архитектура. Когда огромный код уже написан и всплыват косяк с неверно расставленными доступами. Тогда действительно можно влепить костыль подобно вашему, исправить положение дел, не перелопачивая весь код.

Пока навскидку больше не могу придумать им оправдния. Буду признателен, если покажите действительно достойное им применение. Я же тоже могу заблуждаться, не спорю. Однако представленных примеров и аргментов явно недостаточно ввиду их несостоятельности.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 17:33
Цитата Сообщение от nubo Посмотреть сообщение
Мы не знаем, есть ли оно в классе, какой у него доступ. По вашей логике на это наплевать. Берем и модифицируем, чего стесняться.
Покажите, где я такое говорил.
Цитата Сообщение от nubo Посмотреть сообщение
А вот это:
PHP
1
2
$b = new B;
$b->setAge(18);
без комментариев ясно, что мы делаем.
1. Вы противоречите сами себе.
Цитата Сообщение от nubo Посмотреть сообщение
Если это свойство закрыто снаружи, для чего вы к нему ломитесь через магический сеттер? Если его кто-то закрыл или защитил, значит нельзя его трогать.
Цитата Сообщение от nubo Посмотреть сообщение
Устанавливать защищенные методы можно только специальными сеттерами. Магические путают все, что не айс
Цитата Сообщение от KOPOJI Посмотреть сообщение
В некотором роде, это и есть сеттер. Просто php позволяет использовать магические методы __set()/__get(). А реализация (ровно как и ее наличие) зависит лишь от самого программиста, его предпочтений и необходимостей. В других языках зачастую сеттеры пишутся под конкретную величину - setAge, setName и т.д. Использование геттера для получения доступа к закрытому/защищенному свойству не так уж и плохо. Без описания кучи методов вида getName()/getAge() и т.п. Единственный минус - усложнение понятности самого кода, но если использовать с умом, то проблем не возникнет
ну сколько раз мне еще повторить, что если правильно использовать, то ничего плохого не будет? Нравится вам названия setName и другие? Так делайте. Пока вы только пытаетесь мне доказать какую-то чушь.
Только лично я вместо кучи сеттеров setArg1, setArg2, setArg3, setArgN, если это не запутает код - напишу один метод __call() вместо кучи этих самых сеттеров а-ля "другой язык". Не хотите давать доступ ко всем свойствам - задайте список возможных свойств для доступа. Я уже понял (и о ужас, и про это я уже говорил), что вы предпочтете код вида
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class A
{
    protected $var_1 = "value_1";
    protected $var_2 = "value_2";
    protected $var_3 = "value_3";
    protected $var_4 = "value_4";
    protected $var_5 = "value_5";
    protected $var_6 = "value_6";
    protected $var_7 = "value_7";
    protected $var_8 = "value_8";
    protected $var_9 = "value_9";
    protected $var_10 = "value_10";
    protected $var_11 = "value_11";
    protected $var_12 = "value_12";
    protected $var_13 = "value_13";
    protected $var_14 = "value_14";
    protected $var_15 = "value_15";
    protected $var_16 = "value_16";
    protected $var_17 = "value_17";
    protected $var_18 = "value_18";
    protected $var_19 = "value_19";
    protected $var_20 = "value_20";
    protected $var_21 = "value_21";
    protected $var_22 = "value_22";
    protected $var_23 = "value_23";
    protected $var_24 = "value_24";
    protected $var_25 = "value_25";
    protected $var_26 = "value_26";
    protected $var_27 = "value_27";
    protected $var_28 = "value_28";
    protected $var_29 = "value_29";
    protected $var_30 = "value_30";
 
    public function getVar_10() {
        return $this->var_10;
    }
    public function getVar_11() {
        return $this->var_11;
    }
    public function getVar_12() {
        return $this->var_12;
    }
    public function getVar_13() {
        return $this->var_13;
    }
    public function getVar_14() {
        return $this->var_14;
    }
    public function getVar_15() {
        return $this->var_15;
    }
    public function getVar_16() {
        return $this->var_16;
    }
    public function getVar_17() {
        return $this->var_17;
    }
    public function getVar_18() {
        return $this->var_18;
    }
    public function getVar_19() {
        return $this->var_19;
    }
    public function getVar_20() {
        return $this->var_20;
    }
}
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
38
39
40
class B
{
    protected $var_1 = "value_1";
    protected $var_2 = "value_2";
    protected $var_3 = "value_3";
    protected $var_4 = "value_4";
    protected $var_5 = "value_5";
    protected $var_6 = "value_6";
    protected $var_7 = "value_7";
    protected $var_8 = "value_8";
    protected $var_9 = "value_9";
    protected $var_10 = "value_10";
    protected $var_11 = "value_11";
    protected $var_12 = "value_12";
    protected $var_13 = "value_13";
    protected $var_14 = "value_14";
    protected $var_15 = "value_15";
    protected $var_16 = "value_16";
    protected $var_17 = "value_17";
    protected $var_18 = "value_18";
    protected $var_19 = "value_19";
    protected $var_20 = "value_20";
    protected $var_21 = "value_21";
    protected $var_22 = "value_22";
    protected $var_23 = "value_23";
    protected $var_24 = "value_24";
    protected $var_25 = "value_25";
    protected $var_26 = "value_26";
    protected $var_27 = "value_27";
    protected $var_28 = "value_28";
    protected $var_29 = "value_29";
    protected $var_30 = "value_30";
    
    public function __get($name) {
        $allowed = array('var_10', 'var_11', 'var_12', 'var_13', 'var_14', 'var_15', 'var_16', 'var_17', 'var_18', 'var_19', 'var_20');
        if( in_array($name, $allowed) && property_exists($this, $name) ) //и то, проверка property_exists, по сути, не нужна.
            return $this->$name;
        return false;
    }
}
В примере я использовал __get, а не __call. Но, на самом деле - это лишь один из способов, и что выберет программист - зависит лишь от него.
Вы начинаете писать код, видите кучу "getName$i", понимаете, что это просто тихий ужас. Тогда вы начинаете придумывать якобы единственную необходимость в геттерах и сеттерах, а затем вообще бредовую идею о том, что закрытые/защищенные свойства закрыты должны быть на все виды доступа - и на изменение значения, и на считывание. Это просто убивает половину ООП.
Цитата Сообщение от nubo Посмотреть сообщение
И это, я терпеливый. Я долго могу разговаривать со стенкой
Т.е. вы можете долго говорить сами с собой? Это печально..

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от nubo Посмотреть сообщение
костыль
геттеры и сеттеры костыль :rofl:
Не, я отсюда не уйду, я давно уже так не смеялся

0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 18:35
Снизу вверх. Костыль, не сам сеттер, а ваше его применение. Вот перегрузка свойств с помощью именнованных сеттеров, это хороший паттерн. Но он не использует магического сеттера. А уж геттера подавно.
В примере я использовал __get, а не __call. Но, на самом деле - это лишь один из способов, и что выберет программист - зависит лишь от него.
Нет, именно это важно. Вы не можете понять простой вещи. Если у меня дома лежит скажем ноутбук. По вашей логике, если он кому то нужен, можно зайти и попользоваться. В коде это выглядит так:
$notebook->game = 'Warcraft';
А я вот не хочу, что бы кто-то без разрешения в него лазил. Может порно у меня там домашнее. Я пишу так:
$notebook->setGame('Warcraft');
Другими словами я разрешаю играть в игру, но не разрешаю смотреть порно.

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

а затем вообще бредовую идею о том, что закрытые/защищенные свойства закрыты должны быть на все виды доступа - и на изменение значения, и на считывание. Это просто убивает половину ООП.
Не передергивйте. Я говорил о том, что ваша реализация перегрузки свойств глобальна, и затрагивет все свойства класса.

Можно конечно попытаться оградить доступ к другим свойствам так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class A {
    private $array = array();
    
    public function __set($property, $value) 
    {
        $this->array[$property] = $value;
    }
    
    public function __get($property) {
        return $this->array[$property];
    }
}
 
    $b = new A();
    echo 'Возраст: ', $b->age;
я вообще то ждал от вас такой реализации. Но и это ничего особо-хорошего не сулит, так как решает только часть проблемы. Проблема с прозрачностью остается. Как в коде самого класса, так и снаружи понятнее не становится. Ну может вам не важна документированность ваших классов, тогда да, и так сойдет.

Что касается вашего примера с кучей свойств, ну сами же мне показывали статью с перегрузкой методов. Зачем каждый писать отдельно. Неужели не вникли до сих пор?

Вы почему не хотите признать очевидного, эта статья не про магические сеттеры. Она про упрощение использования именновнных. Вот за это я проголосую обеими руками. А магический сеттер от лукавого. Он только путает все, о чем я и предупредил в самом начале. (ну и геттер не лучше)

Добавлено через 5 минут
Что касаемо проверки в самом сеттере, я же говорил - можно навтыкать туда свичей. Ну или массивов как у вас. Но это уже попахивает. А если свойств стопицот? Или понадобится то, которое вы не учли в массиве?

Добавлено через 5 минут
Цитата Сообщение от KOPOJI Посмотреть сообщение
Мы не знаем, есть ли оно в классе, какой у него доступ. По вашей логике на это наплевать. Берем и модифицируем, чего стесняться.
Покажите, где я такое говорил.
Об этом очень недвузначно говорит ваш код.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 19:29
Цитата Сообщение от nubo Посмотреть сообщение
ваше его применение
какое мое применение? Это был лишь пример, зачем он может понадобиться, и ничего более
Цитата Сообщение от nubo Посмотреть сообщение
Вот это главное, принципиальное различие между пользовательскими сеттерами и магическими
ну как обычно, код мы не видим. Вам процитировать, где идет перечень возможных свойств для доступа?
Цитата Сообщение от nubo Посмотреть сообщение
Я говорил о том, что ваша реализация перегрузки свойств глобальна, и затрагивет все свойства класса
Цитата Сообщение от nubo Посмотреть сообщение
Если свойство нужно снружи, оно по определеню должно быть публичным. А если оно закрыто, нефиг лезть
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вы противоречите сами себе.
Цитата Сообщение от nubo Посмотреть сообщение
я вообще то ждал от вас такой реализации
Серьезно? Вы же знаете, что я на это не способен. Скорее, я этот код где-то стырил.
Цитата Сообщение от nubo Посмотреть сообщение
Вот это главное, принципиальное различие между пользовательскими сеттерами и магическими
Цитата Сообщение от nubo Посмотреть сообщение
Что касается вашего примера с кучей свойств, ну сами же мне показывали статью с перегрузкой методов. Зачем каждый писать отдельно
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вы противоречите сами себе.
Цитата Сообщение от nubo Посмотреть сообщение
Но это уже попахивает
даже не буду спрашивать, чем. Экстрасенсорикой, наверное.
Цитата Сообщение от nubo Посмотреть сообщение
А если свойств стопицот?
Вы предлагаете определить "стопицот" методов?
Цитата Сообщение от nubo Посмотреть сообщение
Или понадобится то, которое вы не учли в массиве?
"Или понадобится то, для которого вы не написали метод?"
И да, если у вас "стопицот" свойств/методов, то это уже явно неверная структура и код просто кричит о необходимости реорганизации.
Цитата Сообщение от nubo Посмотреть сообщение
Неужели не вникли до сих пор?
Да вы сначала уж определитесь, хорошо это или плохо. Я говорю, что при вдумчивом использовании в этом нет ничего плохого. Вы утверждаете обратное. Я привожу простой пример, где из-за моей лени опущены проверки, вы к этому сразу же прилипаете (видимо, больше не к чему просто), затем говорите, что использование магических методов это зло вообще, нарушающее принципы ООП, потом утверждаете обратное, затем опять говорите, что магические методы
Цитата Сообщение от nubo Посмотреть сообщение
от лукавого
потом опять говорите, что это все неправильно, затем обратное..
Цитата Сообщение от nubo Посмотреть сообщение
Об этом очень недвузначно говорит ваш код.
Ах, да, точно. Код, написанный чисто для примера, с одним единственным свойством и опущенной сознательно проверкой (о чем, кстати, я уже тоже писал), в совокупе с вашими экстрасенсорными способностями творит чудеса..

Добавлено через 2 минуты

Не по теме:

активнее, активнее, а то скучно :bravo:



Добавлено через 2 минуты
Цитата Сообщение от nubo Посмотреть сообщение
Можно конечно попытаться оградить доступ к другим свойствам так:
И в чем профит? Где-то было хоть слово про динамическое добавление свойств?
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 20:40
Цитата Сообщение от KOPOJI Посмотреть сообщение
Сообщение от nubo Я говорил о том, что ваша реализация перегрузки свойств глобальна, и затрагивет все свойства класса
Сообщение от nubo Если свойство нужно снаружи, оно по определеню должно быть публичным. А если оно закрыто, нефиг лезть
Сообщение от KOPOJI Вы противоречите сами себе.
Где вы увидили противоречие? Давайте я медленно, с расстановкой. Может дойдет.
Вот это:
PHP
1
$b->age;
свойство. Не станете же отрицать?
Обращаетесь вы к нему снаружи класса. Или нет?
Оно у вас в классе имеет уровень доступа protected. Или я что-то напутал?
Обращение к защищенному свойству нарушает принципы инкапсуляции. Или их пересмотрели?

Теперь вторая сторона. Вот это метод:
PHP
1
$b->setNumericAge();
Очевидно?
У него уровень доступа public. Я сходил проверил.
Реализация метода находится в классе. Или придумали как то иначе?
Внутри класса метод имеет право обращаться к свойствам с любым доступом. Не?

Я использую только то, что разрешено. Не нарушая никаких принципов. Если свойство нужно снаружи, ставим публичный доступ. Не нужно мудрить. Если нужен доступ к приватному свойству, я использую возможности класса. Позволяет он доступ, не вопрос. Пользуемся. Но это решает класс. Это принцип инкапсуляции.

Где противорече?

Вот это главное, принципиальное различие между пользовательскими сеттерами и магическими
Сообщение от nubo
Что касается вашего примера с кучей свойств, ну сами же мне показывали статью с перегрузкой методов. Зачем каждый писать отдельно
Сообщение от KOPOJI
Вы противоречите сами себе.
Ключевое слово - перегрузка методов. Не свойств.

Где противоречие?

даже не буду спрашивать, чем. Экстрасенсорикой, наверное.
Я писал чем. Для чего повторяться. Вы просто не читаете моих писулек, так и скажите.

И да, если у вас "стопицот" свойств/методов, то это уже явно неверная структура и код просто кричит о необходимости реорганизации.
Вы сами привели пример, ссылаясь на огромную кучу свойств, когда пытались инкрименировать мне кучу сеттеров. Знчит это ваш код кричит о реорганизации.

А у меня в таких случаях просто есть универсальный сеттер, который не портит общей картины и не нарушает принципов ООП.
PHP
1
2
3
    public function setParam($property, $value) {
        $this->$property = $value;   
    }
Я привожу простой пример, где из-за моей лени опущены проверки,
В том и дело, что такие проверки - говнокод. Есть нормальный механизм установки доступов. Вы дублируете их в магическом сеттере и считаете такое решение крутым.
затем говорите, что использование магических методов это зло вообще, нарушающее принципы ООП, потом утверждаете обратное, затем опять говорите, что магические методы
Не методы. Повторю - не методы. А магические сеттеры и геттеры. Только они. Причем от лукавого они только в части перегрузки свойств.

И в чем профит? Где-то было хоть слово про динамическое добавление свойств?
Ну профита практически нет. Я про это и говорю. Просто так можно разграничить доступы. Это не я придумал кстати. Что-то подобное я видел в мануале.
Цитата Сообщение от KOPOJI Посмотреть сообщение
Не по теме:
активнее, активнее, а то скучно
Не пытайтесь меня задеть. Пустая трата времени.

Добавлено через 18 минут
-
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 21:08
Цитата Сообщение от nubo Посмотреть сообщение
Обращение к защищенному методу нарушает принципы инкапсуляции. Или их пересмотрели?
Обращение? А вы смогли к нему обратиться? Или же вы обратились к методу, который выдал (или не выдал) какое-то значение?
Цитата Сообщение от nubo Посмотреть сообщение
Или придумали как то иначе?
а, вы решили поязвить)
Цитата Сообщение от nubo Посмотреть сообщение
Внутри класса метод имеет право обращаться к свойствам с любым доступом. Не?
"Не", раз уж так охота поязвить. Попробуйте обратиться к родительскому закрытому свойству.
Цитата Сообщение от nubo Посмотреть сообщение
Ключевое слово - перегрузка методов. Не свойств.
Где противоречие?
Действительно. Объясните, пожалуйста, чем таким необычным свойства отличаются от методов, что с одними можно так работать, а с другими нельзя. Это сродни фразе "за рулем десятки можно ездить, за рулем оки нельзя". А люди ездят..
Цитата Сообщение от nubo Посмотреть сообщение
Вы сами привели пример, ссылаясь на огромную кучу свойств, когда пытались инкрименировать мне кучу сеттеров. Знчит это ваш код кричит о реорганизации.
Да знаю я, знаю, что вы не понимаете разницу между некоторыми словами (учить-изучить, теоретический пример-реальный код)..
Цитата Сообщение от nubo Посмотреть сообщение
Я писал чем. Для чего повторяться. Вы просто не читаете моих писулек, так и скажите.
Читаю, с большим удовольствием.. Где же я еще почитаю советы эксперта
Цитата Сообщение от nubo Посмотреть сообщение
В том и дело, что такие проверки - говнокод
Ага, "преждевременная оптимизация" (с). Кстати, вы с ним случайно не родственники? Ввод элементов массива в БД
Цитата Сообщение от nubo Посмотреть сообщение
Не пытайтесь меня задеть. Пустая трата времени.
Да и не пытался. Правда скучно.
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.09.2013, 21:29
Цитата Сообщение от KOPOJI Посмотреть сообщение
Обращение? А вы смогли к нему обратиться? Или же вы обратились к методу, который выдал (или не выдал) какое-то значение?
К свойству. Не к методу. Я описался и уже исправил давно.
"Не", раз уж так охота поязвить. Попробуйте обратиться к родительскому закрытому свойству.
Про наследование мы тут вообще не говорили. Давйте вообще всё ООП сюда вытащим.
Цитата Сообщение от KOPOJI Посмотреть сообщение
Действительно. Объясните, пожалуйста, чем таким необычным свойства отличаются от методов, что с одними можно так работать, а с другими нельзя.
Ни с кем нельзя. Сеттеры то у меня публичные. Даже те, которых нет явно, по умолчанию публичны. Другой вопрос, что сам публичный метод обращается к закрытому свойству, но это не противоречит принципам инкапсуляции. В отличие от.

Цитата Сообщение от KOPOJI Посмотреть сообщение
Ага, "преждевременная оптимизация"
Это не преждевременная оптимизация. Это принцип построения, сиреч архитектура. Оптимизоровать можно то, что не получилось хорошо сделать сразу. Но как говорил мой дед - делать все нужно стараться хорошо. Плохо, оно само получится.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6725 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 21:47
Цитата Сообщение от nubo Посмотреть сообщение
К свойству. Не к методу
PHP
1
2
3
4
5
6
7
8
class A {
    protected $a = ' свойству';
    public function __get($name) {
        return ' методу';
    }
}
$a = new A();
echo 'Я обратился к', $a->a;
Почему я получаю ответ метода, а не свойства, а что в этом свойстве я так и не узнаю?
Цитата Сообщение от nubo Посмотреть сообщение
Про наследование мы тут вообще не говорили. Давйте вообще всё ООП сюда вытащим.
Вы спросили - я ответил. Кстати, так же, как и насчет сеттеров/геттеров. Вы спросили - я привел пример реализации. А уже дальше вы что-то начали говорить про недоООП Хотите - вытаскивайте, мне как-то все равно. Кстати, хотите прикол? Видели заголовок?)
Цитата Сообщение от Firefox__ Посмотреть сообщение
MVC - правильное использование наследования
Цитата Сообщение от nubo Посмотреть сообщение
Даже те, которых нет явно, по умолчанию публичны
поподробнее насчет этого. А то я что-то пропустил, когда вдруг неизвестные методы стали открытыми, да еще и по умолчанию.
Цитата Сообщение от nubo Посмотреть сообщение
Другой вопрос, что сам публичный метод обращается к закрытому свойству, но это не противоречит принципам инкапсуляции

Итак, по порядку. Вот даже еще раз код
PHP
1
2
3
4
5
6
7
8
class A {
    private $a = 'закрытое свойство';
    public function __get($name) {
        return property_exists($this, $name) ? $this->$name : false;
    }
}
$a = new A();
echo $a->a;
Даже специально сделал свойство закрытым, а не защищенным.
Итак, что мы имеем:
1. Свойство закрытое? Да.
2. Метод публичный? Да.
3. Публичный метод обращается к закрытому методу? Да.
4. Противоречит это принципам инкапсуляции? Нет.
Все точь-в-точь по вашей же фразе.
Цитата Сообщение от nubo Посмотреть сообщение
В отличие от.
В отличии от точки? Или от вашего непонимания, что вы неправы и уже не в первый раз противоречите сами себе?
Цитата Сообщение от nubo Посмотреть сообщение
Это не преждевременная оптимизация.
Вы что-то прям уж слишком серьезны.. Это была шутка, печально, что вы не поняли..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.09.2013, 21:47

Правильное использование include (PHP)
Если в пользовательском классе используются еще и другие классы (каждый хранится в отдельном файле), то где правильно размещать...

Правильное использование своих библиотек в модели
Здравствуйте, есть самописная библиотека по решению матриц - Matrix Как мне лучше (правильнее) использовать ее в &quot;голой&quot;...

Правильное построение паттерна "MVC"
Здравствуйте, товарищи. Суть темы заключается в том, что нету конкретного понимания некоторых моментов при использовании паттерна MVC....

Правильное название классов MVC
Здравствуйте. Я новичок в MVC и сразу извиняюсь если вопрос задан не в правильной теме. На днях столкнулся с проблемой. При написании...

использование наследования
Преподаватель одолел не могу разобраться помогите пожалуйста. С# Теория В программах требуется описать базовый класс (возможно,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru