[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: __get() и __set() на русском
fallow
Обьясните пожалуйста на русском языке зачем нужны __get() и __set()
И чем они отличаются от моего созданного метода?
Зачем они были созданны, ведь можно просто создать открытый метод где инициализировать закрытый массив.


<?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 что даёт возможность пропустить один из этапов трансляции. biggrin.gif

Спустя 7 часов, 29 минут, 59 секунд (22.01.2011 - 11:39) twin написал(а):
ути-пути biggrin.gif

Спустя 3 минуты, 24 секунды (22.01.2011 - 11:42) Michael написал(а):
Если по простому объяснить:
Ты будешь обращаться к неким данным как к св-ву объекта:
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'ить виртуальные члены класса.

Спустя 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() вызывается когда идет попытка получения значения несуществующего свойства объекта.
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%


Спустя 4 минуты, 3 секунды (23.01.2011 - 23:02) Guest написал(а):
Хороший пример есть в YII.
Когда через __set() присваивается целый набор элементов формы.
Намного удобнее понять новичку что присваивается набор модели и всё! в противовес функции, объяснять дольше придётся, так как появятся дополнительные вопросы по поводу её реализации.

Спустя 59 минут, 2 секунды (24.01.2011 - 00:01) Dezigo написал(а):
Это нужно в первую очередь для использования интерфейсов. - а так как сказал twin в классах,реализации не нужно.(не используют)
-в interface - где наглядно видно,что при каких свойствах, что принимается,что подоётся,как подовать, какие типы, что воозврощается - всё это можно описать в intreface

Спустя 9 часов, 28 минут, 50 секунд (24.01.2011 - 09:30) linker написал(а):
Dezigo
Интерфейсы нужны для гарантированной реализации объявленных в них методов. Больше применения им я не вижу.

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, на русском опять же одна теория и жиденькие примеры =)
В виде сайта как ирбис было бы вообще удобно, можно всегда дорабатывать и пополнять, можем объединиться все, крайне интересна эта тема =)
user posted image

Спустя 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)
Цитата
при этом получается простое сокращение записи (не такое уж и маленькое) - так, например, в случае с распарсенным xml или еще каким контейнером - удобнее получать элементы по $obj->element, чем по $obj->getChildNode('element')
то есть другими словами мы экономим пару секунд на написание строки (нескольких символов), получая в итоге ребус в плане "а черт его знает, какой метод сейчас сработал..."? Я правильно уловил мысль?

Обращаясь к свойству (закрытому!) но к свойству мы обращаемся к методу 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() имеет простую запись.
$UserTable->admin->showFullname();
которая и говорит, чтобы объект таблица, взяла у себя объект пользователя, который должен выполнить указанный метод.

Спустя 21 минута, 29 секунд (25.01.2011 - 09:44) twin написал(а):
Так сможет кто-нибудь внятно объяснить, не абстрактно и обще, а конкретно, с примером, где от них действительно есть польза?
Я весь гугл перерыл, ничерта не нашел подходящего.
linker привел академический пример объяснения механизма, но это и так ясно, не ясно зачем оно надо.

Йойо разбирать, чтобы понять их предназначение что то времени жалко. Да и фреймворк это, а там еще и не таких извратов понагородят... Не то.

glock18 попытался раскрыть суть, но как то совсем туманно и неубедительно.
Цитата
при этом получается простое сокращение записи (не такое уж и маленькое) - так, например, в случае с распарсенным xml или еще каким контейнером - удобнее получать элементы по $obj->element, чем по $obj->getChildNode('element')
никакого удобства я тут не заметил... По мне так удобнее, когда код прозрачен и управляем. А когда со свойствами происходит непонятно что и непонятно где... Какое тут удобство. Однако он сказал, что я неверно уловил мысль. Но на констатации все и закончилось. Терзают смутные сомнения, что это просто декларация постулата.

Вот это совсем не состоятельно:
Цитата
Для пользователя тем же объектом, новичка в частности, добавление свойству каких то параметров более естественно напрямую чем через метод, ну или выборку данных. В случае с сеттерами и геттерами есть перспектива гибкой проверки и валидации данных.
могу объяснить почему. Новичкам и, тем более, обывателям нет никакой разницы. Для них что одно, что другое - темный лес. А тут медвежья услуга. Мало того, что новый синтаксис, так он еще и извращен до безобразия. Где же тут естественность? Если в любом букваре для начинающих можно найти это:
$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 был бы строго типизированным языком.

Спустя 1 час, 58 минут, 36 секунд (25.01.2011 - 14:34) Dezigo написал(а):
glock18
сдесь пример
http://msdn.microsoft.com/en-us/library/87...b(v=vs.71).aspx
смотришь на interface и душа радуется.

Спустя 9 часов, 34 минуты, 39 секунд (26.01.2011 - 00:08) glock18 написал(а):
Dezigo
как я первоначально и подумал, кто-то не понял о чем речь просто wink.gif

сеттеры и геттеры это одно. магические методы __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 никогда не объявляют в них. да и сама фраза
Цитата
"Это нужно в первую очередь для использования интерфейсов."
Я не сказал что Interface - это set() get(),если читать внимательно - то что я написал,то можно понять,что это используется - когда используются interface.

касается не их, а классических геттеров и сеттеров.

Спустя 18 часов, 15 минут, 50 секунд (27.01.2011 - 10:50) linker написал(а):
glock18
Оно понятно, в классическом виде, каждому свойству соответствует свой геттер и сеттер. В PHP __set() и __get() общие для всех свойств, поэтому каждый из этих методов должен принимать одно лишнее значение - имя свойства.

Спустя 38 минут, 42 секунды (27.01.2011 - 11:28) Гость_kafe написал(а):
Методы __set(), __get() нужны, представьте себе паттерн Sigleton или Регистр без них.

Спустя 11 минут, 18 секунд (27.01.2011 - 11:40) glock18 написал(а):
синглтон легко без них представляю laugh.gif

Спустя 32 минуты, 45 секунд (27.01.2011 - 12:12) twin написал(а):
А я не представляю с ними. smile.gif

Спустя 2 часа, 59 минут, 20 секунд (27.01.2011 - 15:12) linker написал(а):
А я без него их представляю smile.gif

Спустя 7 месяцев, 13 дней, 23 часа, 21 минута, 47 секунд (11.09.2011 - 13:33) TranceIT написал(а):
Цитата (Dezigo @ 23.01.2011 - 21:01)
что подоётся,как подовать

Подован =)))

Придерживаюсь мнения twin'а. Один раз почесать __get и __set и забыть...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.