Реализации read-only свойств в классах.

Krishna

Продался Java
Похоже магические методы __get я приберегу для всяких хитрых враперов.
Да, вот такое применение, имхо, уже может быть оправдано, в определенных случаях.
 

Fortop

Новичок
Уф...
PHP:
$p = new TestClass();
$p->id = 'opa';
var_dump($p);
Почитайте описание
И что я там должен для себя нового вычитать? Если Вы не в курсе - phpDoc не учитывается во время выполнения, но зато работает в IDE и при документировании кода.
И естественно что его нужно использовать вместе с выбрасыванием конкретного исключения, о чем я Вам и сказал.

Прочтите внимательно первый пост в топике.
Т.е. это моя задача понять кашу в чужой голове?
А не Ваша - объяснить свой вопрос.

Любопытно....
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а я это сразу написал: у ТСа проблемы коммуникации
он считает, что понимание другими его проблемы - задача других, а не его

-~{}~ 02.04.10 00:32:

Автор оригинала: Бочонок
сказать как бы вы поступили, если бы вам было необходимо обеспечить доступ к свойствам "только для чтения". Мне интересны только ваши мысли по этому поводу.
ну дык прямо и формулируй: "как обеспечить read-only?"
Ответ: через геттер и private/protected - лучшее решение в 99% случаев.
можно "левой рукой правое ухо": __get, интерфейс ArrayAccess, но эти средства созданы для других целей
 

Adelf

Administrator
Команда форума
Чудо-программист какой-то из Яндекса вам попался :) За что ему конечно большое спасибо.

Ну что за бред. Какое преимущество можно получить в данном случае от __get? Ну хоть одно можно назвать?

Сегодня на митинге немного флеймили о том, какой должен был код.. ну кроме того, что он должен выполнять свою задачу он должен быть:
1) Легко поддерживаемым
2) Легко расширяемым
3) Легко читаемым

Причем Читаемость я ставлю выше, ибо два первых от нее сильно зависят. Вот в данном случае:
Изначальный пример. Есть класс у него есть методы: getAlbumCollection() getPhotoCollection(). Английским о белому: You can get Album and photo collections. Мимолетный взгляд на интерфейс класса и мы знаем о нем все.
Что же нам предлагает товарищ из Яндекса? Даже расписывать не хочу этот бред и следующий за ним говнокод.
 

fixxxer

К.О.
Партнер клуба
я бы начал с вопроса на кой тебе понадобились геттеры.

если код, использующий их, выглядит примерно так

$OtherObj->foo( $Bar->getSmth() )

то архитектурная проблема собственно вот она - man tell don't ask

p.s. чувак из яндекса пускай гуляет лесом
 

Бочонок

http://frontender.info
2fixxxer:
Я не очень понял, о чем идет речь.
Можно более подробно о возможном наличии архитектурной проблемы?

Библиотека о которой идет речь: http://code.websaints.net/

2Adelf: спасибо большое за ответ.
 

Fortop

Новичок
Krishna
А волшебный метод задуман для более хитрых случаев.
grigori
__get, интерфейс ArrayAccess, но эти средства созданы для других целей
Вот Krishna сбежал :) а я бы, с удовольствием послушал мысли - для чего они(магические методы, да и про ArrayAccess тоже будет интересно) созданы.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Fortop
та он не сбежал - наш великий теоретик от джавы таки сподвигся на применение ООП в отдельно взятой программе с денежной компенсацией потраченного времени :)

у нас с ним уже десятки килобайт на эти темы написана по аське, причем я чаще в роли ученика :)
 

Fortop

Новичок
Ну для себя(из своего опыта) я вынес ряд вещей.
1. я не люблю обязательные get/set особенно в тех случаях когда они содержат всего лишь присвоение закрытым свойствам.
2. для быстрого прототипирования __get/__set - супер.
3. в нагрузке - это зло.
4. одинаковость подхода - рулит. Т.е. либо везде пишутся getPropery/setPropery, либо нигде, а смешивать - зло.

Мне удобнее и приятнее :D $obj->property , поэтому магия помогает, если нужен геттер/сеттер - он доопределяется и вызывается неявно, для остальных свойств все остается без изменений.

А интересует как раз
более хитрых случаев.
для других целей
т.е. идеи :)
 

whirlwind

TDD infected, paranoid
Магические методы делают интерфейс неявным. Неявный интерфейс - передача объектов по соглашению, т. е. работает против Tell Don't Ask.
 

AmdY

Пью пиво
Команда форума
воспользуйся дедовским способом, все закрытые переменные именуй с _<имя> в геттере соответственно
PHP:
public function __get($name) {
        if (!isset($this->{$name}) || strpos($name, '_') === 0) {
            throw new Exception('низя');
        }
        return $this->{$name};
    }
 

Бочонок

http://frontender.info
2AmdY: Спасибо большое за совет. Я решил для получения каждой переменной создать свой метод и не использовать для данной задачи __get, но он неприменно мне пригодится в схожей ситуации.
 

AmdY

Пью пиво
Команда форума
есть ещё _правильный_ способ, через рефлексию, но он мне не нравится php не джава.
ну и чтобюы закончить с темой, могию нужно применять там, где нет операций над переменной, типо приведение к типу, экранирование html.... поэтому лучше ещё в __get проверять наличие метода get<NAME>() или set<NAME>($value)
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: Бочонок
2fixxxer:
Я не очень понял, о чем идет речь.
Можно более подробно о возможном наличии архитектурной проблемы?
ох и сподвиг ты меня на поиски =)

вот читай комменты crazy, я понятнее все равно не распишу =)

http://demiurg.livejournal.com/60458.html?thread=735786#t735786
 

AmdY

Пью пиво
Команда форума
Krishna
про рефлексию я врал по невнимательности, оба же метода приватные. но затем притянул за уши, что можно phpdoc таким образом анализировать. но и этот способ зависит от дисциплинированности программистов. :(
 

Бочонок

http://frontender.info
2fixxxer:
Спаибо огромное за то, что вы потратили на них время и силы. [Убежал читать изнывая от любопытства]


AmdY:
Про рефлекцию вообще ничего не понял. Можно поподробнее?
Свойства вообще то "протектед". Или о каких методах речь?
 

Viktor_Rez

Новичок
Re: Реализации read-only свойств в классах.

Автор оригинала: Бочонок
Приятного времени суток.

Столкнулся с задачей реализации read-only свойств в классах.

Сделал просто и понятно:
PHP:
class testClass{	

	protected $albumCollection = 'Я могу считать это значение, но не могу записать.';
	protected $photoCollection = 'Read only';
	
	public function getAlbumCollection(){
		return $this->albumCollection;
	}
	public function getPhotoCollection(){
		return $this->photoCollection;
	}
}
Но, когда мой код рецензировал некий программист, работающий в Яндекс (за что ему огромное спасибо), он написал:


Ну ... в общем то это не большая проблема. Написал:
PHP:
class testClass{	

	protected $albumCollection = 'Я могу считать это значение, но не могу записать.';
	protected $photoCollection = 'Read only';
	
	public function __get($name){
		return $this->$name;
	}
}
А как тогда защитить те свойства, которые не нужно позволять читать? Вот таким вот извращенным методом?

PHP:
class testClass{	
	private $hidden = array('photoCollection');
	protected $albumCollection = 'Я могу считать это значение, но не могу записать.';
	protected $photoCollection = 'Read only';
	
	public function __get($name){
		if (in_array($name,$hidden)) throw new Exception("А нету!", E_ERROR);
		return $this->$name;
	}
}
В общем, я в задумчивости. Подскажите, пожалуйста, как лучше сделать?
Может быть я что то вообще не то делаю?

С уважением. Боченок.
Ну вот когда действительно не ясно, нафига? Мне вот не понятно, ты вроде как парень смышленный. В моей рецензии это только несколько строк.
 
Сверху