И чем они отличаются от моего созданного метода?
Зачем они были созданны, ведь можно просто создать открытый метод где инициализировать закрытый массив.
<?php
class cls
{
private $example = array();
/********************/
function __get($index)
{
return $this->example[$index];
}
function __set($index, $value)
{
$this->example[$index] = $value;
}
/**********************/
function Open($index, $value)
{
return $this->example[$index] = $value;
}
}
$obj = new cls();
$obj->Name = "Alex";
echo '<pre>';
print_r($obj);
echo '</pre>';
$obj->Open('name', 'Alex');
echo '<pre>';
print_r($obj);
echo '</pre>';
?>
Спустя 57 минут, 59 секунд (21.01.2011 - 23:33) twin написал(а):
Цитата |
Обьясните пожалуйста на русском языке зачем нужны __get() и __set() |
Спустя 4 часа, 36 минут, 29 секунд (22.01.2011 - 04:09) Guest написал(а):
обисцявся twinДа будет известно что методы которые интегрированы в интерпритатор уже на оболочке C что само по себе уже производительно, аргументирую не на PHP а на C что даёт возможность пропустить один из этапов трансляции.
Спустя 7 часов, 29 минут, 59 секунд (22.01.2011 - 11:39) twin написал(а):
ути-пути
Спустя 3 минуты, 24 секунды (22.01.2011 - 11:42) Michael написал(а):
Если по простому объяснить:
Ты будешь обращаться к неким данным как к св-ву объекта:
echo $obj->someName;
- удобно и кратко, но это не будет обычное св-во как переменная - что-то только содержит, то и возвращает. А результат некой предварительной обработки. Такие себе воротца к самим данным.
Использовать - с умом, но возможность стоящая.
Ты будешь обращаться к неким данным как к св-ву объекта:
echo $obj->someName;
- удобно и кратко, но это не будет обычное св-во как переменная - что-то только содержит, то и возвращает. А результат некой предварительной обработки. Такие себе воротца к самим данным.
Использовать - с умом, но возможность стоящая.
Спустя 1 час, 7 минут, 41 секунда (22.01.2011 - 12:50) glock18 написал(а):
Цитата (twin @ 21.01.2011 - 20:33) |
Нахрен они не нужны. Так, побловаться. |
зря так, у них довольно широкое применение, а вот пример использования по ссылке - совершенно нежизненный, и по сути наличие __get/__set ни на йоту не меняет поведение класса в этом примере.
__isset
__unset
эти два там тоже совершенно ненормально показаны
Спустя 25 минут, 42 секунды (22.01.2011 - 13:16) twin написал(а):
Мого быть, мого быть...
Может и есть какие то хитрые возможности у этих вещей, но так, как они обычно применяются... Фиг знает.
Мне все время анекдот вспоминается, как мужик стирал штаны и причитал: "ну никому, никому верить нельзя! даже себе. ведь всего-то пукнуть хотел!"
Все эти гетеры-сетеры для того, чтобы себя же проверять. А вдруг я накосячу и обратюся к неопределенным свойствам.
По мне так они не просто нахрен не нужны, но еще и вредят. Я сейчас даже не про ресурс. Я про то, что они расхолаживают и делают программиста толстым и ленивым.
Может и есть какие то хитрые возможности у этих вещей, но так, как они обычно применяются... Фиг знает.
Мне все время анекдот вспоминается, как мужик стирал штаны и причитал: "ну никому, никому верить нельзя! даже себе. ведь всего-то пукнуть хотел!"
Все эти гетеры-сетеры для того, чтобы себя же проверять. А вдруг я накосячу и обратюся к неопределенным свойствам.
По мне так они не просто нахрен не нужны, но еще и вредят. Я сейчас даже не про ресурс. Я про то, что они расхолаживают и делают программиста толстым и ленивым.
Спустя 29 минут, 50 секунд (22.01.2011 - 13:46) glock18 написал(а):
twin
ты просто не понимаешь зачем они нужны, проверка себе совершенно не нужна, а __isset, ты не поверишь, нужен совершенно для того, чтобы дать возможность isset'ить виртуальные члены класса.
ты просто не понимаешь зачем они нужны, проверка себе совершенно не нужна, а __isset, ты не поверишь, нужен совершенно для того, чтобы дать возможность isset'ить виртуальные члены класса.
Спустя 6 часов, 13 минут, 49 секунд (22.01.2011 - 19:59) Guest написал(а):
Цитата (twin @ 22.01.2011 - 10:16) |
Все эти гетеры-сетеры для того, чтобы себя же проверять. А вдруг я накосячу и обратюся к неопределенным свойствам. По мне так они не просто нахрен не нужны, но еще и вредят. Я сейчас даже не про ресурс. Я про то, что они расхолаживают и делают программиста толстым и ленивым. |
От косяков применяются проверки в этих же виртуальных функциях.
Расхолаживанию программиста как раз таки приводит не простота в использовании и гибкость, а замудренные и не гибкие коды и архитектуры, к коим и относятся процедурные (если конечно проект не велик!).
Спустя 15 часов, 45 минут, 7 секунд (23.01.2011 - 11:45) linker написал(а):
fallow
Функция __set() вызывается когда идет установка значения несуществующему свойству объекта.
Функция __get() вызывается когда идет попытка получения значения несуществующего свойства объекта.
Функция __set() вызывается когда идет установка значения несуществующему свойству объекта.
Функция __get() вызывается когда идет попытка получения значения несуществующего свойства объекта.
class AНе смотри на Твина, он просто не умеет их готовить.
{
protected $Properties = array();
public function __set($PropertyName, $PropertyValue)
{
$this->Properties[$PropertyName] = $PropertyValue;
}
public function __get($PropertyName)
{
return isset($this->Properties[$PropertyName]) ? $this->Properties[$PropertyName] : null;
}
}
$A = new A();
$A->b = 1;
echo $A->b; // Выведет "1"
Спустя 2 часа, 39 минут, 55 секунд (23.01.2011 - 14:25) twin написал(а):
Цитата |
Не смотри на Твина, он просто не умеет их готовить. |
Ога. Еще я не умею готовить коконы шелкопряда, лягушачьи лапки и рыбу лютефиск.
Если господа знают толк в извращениях, не вопрос. Я вот для себя знаю, что спокойно можно прожить, попробовав эти изыски один раз из любопытства, а то и вообще забив.
Вот сам вдумайся, что ты такое написал и зачем.
Если господа знают толк в извращениях, не вопрос. Я вот для себя знаю, что спокойно можно прожить, попробовав эти изыски один раз из любопытства, а то и вообще забив.
Вот сам вдумайся, что ты такое написал и зачем.
Цитата |
вызывается когда идет установка значения несуществующему свойству объекта. |
Тоесть сделать его (свойство) существующим, можно только через заднее место? Просто прописать
Нуну.
public $b;нам религия не позволяет, инкапсуляция же. Сами себя плетками стегаете и считаете это верхом блаженства. :D
Нуну.
Спустя 8 часов, 33 минуты, 14 секунд (23.01.2011 - 22:58) Guest написал(а):
а если доступ ограничен (и должен быть ограничен что бы некоторые полудурки ничего не сделали, кстати код linker упрощён, но если его ещё и проверку сделать от как раз тех что написал выше) к переменной private $b - array(); тогда именно религия и не позволит.
кстати у Вас то не инкапсуляция 100%
кстати у Вас то не инкапсуляция 100%
Спустя 4 минуты, 3 секунды (23.01.2011 - 23:02) Guest написал(а):
Хороший пример есть в YII.
Когда через __set() присваивается целый набор элементов формы.
Намного удобнее понять новичку что присваивается набор модели и всё! в противовес функции, объяснять дольше придётся, так как появятся дополнительные вопросы по поводу её реализации.
Когда через __set() присваивается целый набор элементов формы.
Намного удобнее понять новичку что присваивается набор модели и всё! в противовес функции, объяснять дольше придётся, так как появятся дополнительные вопросы по поводу её реализации.
Спустя 59 минут, 2 секунды (24.01.2011 - 00:01) Dezigo написал(а):
Это нужно в первую очередь для использования интерфейсов. - а так как сказал twin в классах,реализации не нужно.(не используют)
-в interface - где наглядно видно,что при каких свойствах, что принимается,что подоётся,как подовать, какие типы, что воозврощается - всё это можно описать в intreface
-в interface - где наглядно видно,что при каких свойствах, что принимается,что подоётся,как подовать, какие типы, что воозврощается - всё это можно описать в intreface
Спустя 9 часов, 28 минут, 50 секунд (24.01.2011 - 09:30) linker написал(а):
Dezigo
Интерфейсы нужны для гарантированной реализации объявленных в них методов. Больше применения им я не вижу.
twin
Это необходимо для упрощения работы в случае с динамическими полями объектов. Я использую сеттеры и геттеры, например, для прозрачного доступа к объектам в базах данных, XML и прочее.
Интерфейсы нужны для гарантированной реализации объявленных в них методов. Больше применения им я не вижу.
twin
Это необходимо для упрощения работы в случае с динамическими полями объектов. Я использую сеттеры и геттеры, например, для прозрачного доступа к объектам в базах данных, XML и прочее.
Спустя 8 часов, 48 минут, 26 секунд (24.01.2011 - 18:18) Guest написал(а):
Dezigo
Сеттеры и геттеры никогда интерфейсами не были, не есть и не будут!
Интерфейс объекта это "точки воздействия" на объект или от него и никак не иначе.
Сеттеры и геттеры никогда интерфейсами не были, не есть и не будут!
Интерфейс объекта это "точки воздействия" на объект или от него и никак не иначе.
Спустя 5 минут, 7 секунд (24.01.2011 - 18:23) twin написал(а):
Цитата |
Это необходимо для упрощения работы в случае с динамическими полями объектов. Я использую сеттеры и геттеры, например, для прозрачного доступа к объектам в базах данных, XML и прочее. |
хочется подробностей
Спустя 14 минут, 43 секунды (24.01.2011 - 18:38) Dron19 написал(а):
да, действительно, в двух словах про эти методы не расскажешь...
Спустя 1 минута, 37 секунд (24.01.2011 - 18:40) glock18 написал(а):
Цитата (Guest @ 23.01.2011 - 20:02) |
Хороший пример есть в YII. |
йойо вообще прекрасный пример архитектурного решения, согласен. реализация __get интересная у него, даже не у форм, а у приложения. Хотя формы вообще пример самый понятный, пожалуй.
twin
не всегда можно заранее понять какое свойство будет, и будет ли. по сути __get позволит вызывать метод, обращаясь к свойству, как например какой-нибудь getValueByKey($key), но выглядеть будет не
$obj->getValueByKey($key);
а
$obj->{$key}
при этом получается простое сокращение записи (не такое уж и маленькое) - так, например, в случае с распарсенным xml или еще каким контейнером - удобнее получать элементы по $obj->element, чем по $obj->getChildNode('element')
Иногда можно получить кое-какое более существенное преимущество, с использованием, например, делегирования внутри __get, что зависит от архитектуры приложения все же.
Спустя 51 минута, 33 секунды (24.01.2011 - 19:31) Slays написал(а):
Люди, прошаренные в ООП, состряпайте для нас хорошенький курс, только практический, теории и так везде полно, практики крайне не хватает, все хорошие книги на eng, на русском опять же одна теория и жиденькие примеры =)
В виде сайта как ирбис было бы вообще удобно, можно всегда дорабатывать и пополнять, можем объединиться все, крайне интересна эта тема =)
В виде сайта как ирбис было бы вообще удобно, можно всегда дорабатывать и пополнять, можем объединиться все, крайне интересна эта тема =)
Спустя 26 минут, 42 секунды (24.01.2011 - 19:58) twin написал(а):
Цитата |
при этом получается простое сокращение записи (не такое уж и маленькое) - так, например, в случае с распарсенным xml или еще каким контейнером - удобнее получать элементы по $obj->element, чем по $obj->getChildNode('element') |
то есть другими словами мы экономим пару секунд на написание строки (нескольких символов), получая в итоге ребус в плане "а черт его знает, какой метод сейчас сработал..."? Я правильно уловил мысль?
Спустя 15 минут, 36 секунд (24.01.2011 - 20:13) glock18 написал(а):
Цитата (twin @ 24.01.2011 - 16:58) |
Я правильно уловил мысль? |
нет
Спустя 3 часа, 4 минуты, 17 секунд (24.01.2011 - 23:18) Guest написал(а):
Цитата (twin @ 24.01.2011 - 16:58) | ||
то есть другими словами мы экономим пару секунд на написание строки (нескольких символов), получая в итоге ребус в плане "а черт его знает, какой метод сейчас сработал..."? Я правильно уловил мысль? |
Обращаясь к свойству (закрытому!) но к свойству мы обращаемся к методу getChildNode() к методу в применении метода к доступу. но ведь свойство (не ужели не понятно, при чём тут секунда давки на клаву). Для пользователя тем же объектом, новичка в частности, добавление свойству каких то параметров более естественно напрямую чем через метод, ну или выборку данных. В случае с сеттерами и геттерами есть перспектива гибкой проверки и валидации данных.
Спустя 10 минут, 59 секунд (24.01.2011 - 23:29) twin написал(а):
Ниасилил. Вот так же и код пишите наверное, как это "разъяснение".
Набор несвязанных фраз без знаков препинания и какого-либо смысла.
Я от того и говорю - баловство это все. Как же прав все же Стерлинг Хьюз. Не устаю удивляться:
Набор несвязанных фраз без знаков препинания и какого-либо смысла.
Я от того и говорю - баловство это все. Как же прав все же Стерлинг Хьюз. Не устаю удивляться:
Цитата |
У меня такое чувство, что всё ООП состоит из превращения уже имеющихся задач в новые. И уже только потом дело доходит до их решения. |
Спустя 1 час, 6 минут, 7 секунд (25.01.2011 - 00:35) Dezigo написал(а):
Цитата (Guest @ 24.01.2011 - 15:18) |
Dezigo Сеттеры и геттеры никогда интерфейсами не были, не есть и не будут! Интерфейс объекта это "точки воздействия" на объект или от него и никак не иначе. |
"Это нужно в первую очередь для использования интерфейсов."
Я не сказал что Interface - это set() get(),если читать внимательно - то что я написал,то можно понять,что это используется - когда используются interface.
Спустя 8 часов, 10 минут, 12 секунд (25.01.2011 - 08:45) glock18 написал(а):
Цитата (Dezigo @ 24.01.2011 - 21:35) |
Я не сказал что Interface - это set() get(),если читать внимательно - то что я написал,то можно понять,что это используется - когда используются interface. |
это то понятно, но я ни коим образом не понял заключение, что __set и __get в первую очередь с интерфейсами используются.
Спустя 37 минут, 9 секунд (25.01.2011 - 09:22) linker написал(а):
twin
Все очень просто.
Допустим в таблице юзверей есть человек с логином admin, тогда с помощью __get() имеет простую запись.
Все очень просто.
Допустим в таблице юзверей есть человек с логином admin, тогда с помощью __get() имеет простую запись.
$UserTable->admin->showFullname();которая и говорит, чтобы объект таблица, взяла у себя объект пользователя, который должен выполнить указанный метод.
Спустя 21 минута, 29 секунд (25.01.2011 - 09:44) twin написал(а):
Так сможет кто-нибудь внятно объяснить, не абстрактно и обще, а конкретно, с примером, где от них действительно есть польза?
Я весь гугл перерыл, ничерта не нашел подходящего.
linker привел академический пример объяснения механизма, но это и так ясно, не ясно зачем оно надо.
Йойо разбирать, чтобы понять их предназначение что то времени жалко. Да и фреймворк это, а там еще и не таких извратов понагородят... Не то.
glock18 попытался раскрыть суть, но как то совсем туманно и неубедительно.
Я весь гугл перерыл, ничерта не нашел подходящего.
linker привел академический пример объяснения механизма, но это и так ясно, не ясно зачем оно надо.
Йойо разбирать, чтобы понять их предназначение что то времени жалко. Да и фреймворк это, а там еще и не таких извратов понагородят... Не то.
glock18 попытался раскрыть суть, но как то совсем туманно и неубедительно.
Цитата |
при этом получается простое сокращение записи (не такое уж и маленькое) - так, например, в случае с распарсенным xml или еще каким контейнером - удобнее получать элементы по $obj->element, чем по $obj->getChildNode('element') |
никакого удобства я тут не заметил... По мне так удобнее, когда код прозрачен и управляем. А когда со свойствами происходит непонятно что и непонятно где... Какое тут удобство. Однако он сказал, что я неверно уловил мысль. Но на констатации все и закончилось. Терзают смутные сомнения, что это просто декларация постулата.
Вот это совсем не состоятельно:
Вот это совсем не состоятельно:
Цитата |
Для пользователя тем же объектом, новичка в частности, добавление свойству каких то параметров более естественно напрямую чем через метод, ну или выборку данных. В случае с сеттерами и геттерами есть перспектива гибкой проверки и валидации данных. |
могу объяснить почему. Новичкам и, тем более, обывателям нет никакой разницы. Для них что одно, что другое - темный лес. А тут медвежья услуга. Мало того, что новый синтаксис, так он еще и извращен до безобразия. Где же тут естественность? Если в любом букваре для начинающих можно найти это:
то про сеттеры и геттеры не в каждом. И будет человек введен в заблуждение, подумав, что это в порядке вещей.
Должно быть простое и естественное объяснение, где именно и как они действительно необходимы и приносят пользу.
Уж очень хочется разобраться.
PS
$obj->getValueByKey($key);
то про сеттеры и геттеры не в каждом. И будет человек введен в заблуждение, подумав, что это в порядке вещей.
Должно быть простое и естественное объяснение, где именно и как они действительно необходимы и приносят пользу.
Уж очень хочется разобраться.
PS
Цитата |
Допустим в таблице юзверей есть человек с логином admin, тогда с помощью __get() имеет простую запись. |
Вот это уже ближе к телу. Но пока очевидной выгоды не видно. Можешь это по подробнее?
Спустя 25 минут, 56 секунд (25.01.2011 - 10:10) linker написал(а):
twin
Отлично, второй пример, есть таблица, где поля есть свойства некоего объекта. Решил я, что не хватает еще одного поля в таблице, замечательно добавил и забыл - это есть динамические свойства. Я только добавил поле в таблице, не залезая при это еще и в код класса. Разве не удобно?
Отлично, второй пример, есть таблица, где поля есть свойства некоего объекта. Решил я, что не хватает еще одного поля в таблице, замечательно добавил и забыл - это есть динамические свойства. Я только добавил поле в таблице, не залезая при это еще и в код класса. Разве не удобно?
Спустя 1 час, 55 минут, 22 секунды (25.01.2011 - 12:05) twin написал(а):
Вот. Теперь все ясно.
Тут вот в чем дело, я уже много раз говорил об этом. Тут дело в узурпации. Удобным считается только то, что выгодно разработчику. Эти методы хороши в фреймворках и прочих конструкторах, которые призваны облегчить разработку продукта и совершенно не учитывают побочные явления. Такие как скорость исполнения, ресурсоемкость, да и преславутую управляемость.
Я вот твердо убежден в том, что удобнее и выгоднее один раз в пятилетку (согласись, поля в таблицу добавляются не каждый день) изменить что то в классе, наплевав на инкапсуляцию (та еще штучка), чем пожизненно заставлять скрипт тратить ресурс.
Ну впрочем каждый выбирает себе сам.
Тут вот в чем дело, я уже много раз говорил об этом. Тут дело в узурпации. Удобным считается только то, что выгодно разработчику. Эти методы хороши в фреймворках и прочих конструкторах, которые призваны облегчить разработку продукта и совершенно не учитывают побочные явления. Такие как скорость исполнения, ресурсоемкость, да и преславутую управляемость.
Я вот твердо убежден в том, что удобнее и выгоднее один раз в пятилетку (согласись, поля в таблицу добавляются не каждый день) изменить что то в классе, наплевав на инкапсуляцию (та еще штучка), чем пожизненно заставлять скрипт тратить ресурс.
Ну впрочем каждый выбирает себе сам.
Спустя 30 минут, 3 секунды (25.01.2011 - 12:35) linker написал(а):
twin
Ошибаешься, я своих проектах постоянно что-то правлю. Не только существующие таблицы, добавляются новые (спасибо наследованию) - меньше работы. Кроме таблиц, есть файлы, есть данные в XML и прочее и прочее. Если бы не было бы, а точнее если бы подобное не позволялось, то PHP был бы строго типизированным языком.
Ошибаешься, я своих проектах постоянно что-то правлю. Не только существующие таблицы, добавляются новые (спасибо наследованию) - меньше работы. Кроме таблиц, есть файлы, есть данные в XML и прочее и прочее. Если бы не было бы, а точнее если бы подобное не позволялось, то PHP был бы строго типизированным языком.
Спустя 1 час, 58 минут, 36 секунд (25.01.2011 - 14:34) Dezigo написал(а):
glock18
сдесь пример
http://msdn.microsoft.com/en-us/library/87...b(v=vs.71).aspx
смотришь на interface и душа радуется.
сдесь пример
http://msdn.microsoft.com/en-us/library/87...b(v=vs.71).aspx
смотришь на interface и душа радуется.
Спустя 9 часов, 34 минуты, 39 секунд (26.01.2011 - 00:08) glock18 написал(а):
Dezigo
как я первоначально и подумал, кто-то не понял о чем речь просто
сеттеры и геттеры это одно. магические методы __set и __get - другое.
как я первоначально и подумал, кто-то не понял о чем речь просто
сеттеры и геттеры это одно. магические методы __set и __get - другое.
Спустя 35 минут, 43 секунды (26.01.2011 - 00:44) linker написал(а):
В PHP __set() и __get() фактически и есть сеттеры и геттеры.
Спустя 9 часов, 26 минут, 36 секунд (26.01.2011 - 10:11) Guest написал(а):
Цитата (linker @ 25.01.2011 - 21:44) |
В PHP __set() и __get() фактически и есть сеттеры и геттеры. |
Та ну да ...
Спустя 6 часов, 23 минуты, 14 секунд (26.01.2011 - 16:34) glock18 написал(а):
linker
в принципе да, но в несколько более общем виде. хотя в C# реализация сеттеров/геттеров как раз на уровне магических __get, __set, все же это не одно и то же. начнем хотя бы с того, что классический сеттер и геттер получают на один параметр меньше.
Dezigo
в интерфейсах нет определений методов. да, сеттеры и геттеры надо, если они есть, объявлять в интерфейсах, но __get и __set никогда не объявляют в них. да и сама фраза
в принципе да, но в несколько более общем виде. хотя в C# реализация сеттеров/геттеров как раз на уровне магических __get, __set, все же это не одно и то же. начнем хотя бы с того, что классический сеттер и геттер получают на один параметр меньше.
Dezigo
в интерфейсах нет определений методов. да, сеттеры и геттеры надо, если они есть, объявлять в интерфейсах, но __get и __set никогда не объявляют в них. да и сама фраза
Цитата |
"Это нужно в первую очередь для использования интерфейсов." Я не сказал что Interface - это set() get(),если читать внимательно - то что я написал,то можно понять,что это используется - когда используются interface. |
касается не их, а классических геттеров и сеттеров.
Спустя 18 часов, 15 минут, 50 секунд (27.01.2011 - 10:50) linker написал(а):
glock18
Оно понятно, в классическом виде, каждому свойству соответствует свой геттер и сеттер. В PHP __set() и __get() общие для всех свойств, поэтому каждый из этих методов должен принимать одно лишнее значение - имя свойства.
Оно понятно, в классическом виде, каждому свойству соответствует свой геттер и сеттер. В PHP __set() и __get() общие для всех свойств, поэтому каждый из этих методов должен принимать одно лишнее значение - имя свойства.
Спустя 38 минут, 42 секунды (27.01.2011 - 11:28) Гость_kafe написал(а):
Методы __set(), __get() нужны, представьте себе паттерн Sigleton или Регистр без них.
Спустя 11 минут, 18 секунд (27.01.2011 - 11:40) glock18 написал(а):
синглтон легко без них представляю
Спустя 32 минуты, 45 секунд (27.01.2011 - 12:12) twin написал(а):
А я не представляю с ними.
Спустя 2 часа, 59 минут, 20 секунд (27.01.2011 - 15:12) linker написал(а):
А я без него их представляю
Спустя 7 месяцев, 13 дней, 23 часа, 21 минута, 47 секунд (11.09.2011 - 13:33) TranceIT написал(а):
Цитата (Dezigo @ 23.01.2011 - 21:01) |
что подоётся,как подовать |
Подован =)))
Придерживаюсь мнения twin'а. Один раз почесать __get и __set и забыть...