Доступ с свойствам класса

[DAN]

Старожил PHPClub
Доступ с свойствам класса

Всем привет!

Вопрос вобщем-то риторический, просто хочется услышать ваше мнение.

На сегодняшний день есть как минимум 3 (три) наиболее часто используемые возможности получить доступ к свойствам класса.
PHP:
1) $this->property
2) $this->getProperty(); & $this->setProperty(value);
3) $this->get('property'); & $this->set('property', 'value');
Понятно, что 1) удобен в случае, если свойства являются простыми типами данных и не требуют проверок или каких либо действий над ними при чтении/записи.
Варианты 2) и 3) предназначены либо для предварительной обработки свойств, либо для private/protected свойств.

Так вот, при наличии в программе классов с различной степенью инкапсуляции данных и типов этих данных хочется понять, стОит ли комбинировать возможности доступа к свойствам класса как для конкретного класса, так и для всех классов в программе.
Либо применить какой-либо подход ко всем классам.

Вобщем любые pro и contra приветствуются.
 

Кром

Новичок
На сегодняшний день есть как минимум 3 (три) наиболее часто используемые возможности получить доступ к свойствам класса.

1) $this->property
2) $this->getProperty(); & $this->setProperty(value);
3) $this->get('property'); & $this->set('property', 'value');
Твой вопрос можно двояко понять. Тебя интересует досуп внутри класса и/или извне? :)
 

[DAN]

Старожил PHPClub
Кром, внутри класса как раз всё понятно.
В классическом понимании protected свойств у php нет, а самому себе вредить и присваивать свойствам "левые" значения вряд ли кто-то захочет. Тут наверное больше зависит от самого класса, конкретного класса.

Интересует доступ к свойствам извне.
Причем не столько вопрос безопасности, сколько вопрос стиля и этики.
Я, честно признаться, до сих пор не могу определиться, что удобнее, 1) 2) или 3) вариант. И если выбирать между ними, то хочется взять один за основной и использовать его везде, где не запрещено :)

Кстати, в статье по ссылке, которую привел Макс, тоже "вопрос риторический".
 

Popoff

popoff.donetsk.ua
И если выбирать между ними, то хочется взять один за основной и использовать его везде, где не запрещено :)
Я думаю, что вот это и есть основное - что бы везде было одинаково, что бы не бегать каждый раз к исходному коду и не вспоминать, а какой же ш из этих способов я там использовал. Каким именно способом одинаково - это вопрос вкуса конкретного программиста, если он работает сам или вопрос правил, которые для себя составляют программисты, если они работают в группе. В целом, правила тоже часто составляются по вкусу составителя :)

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

Кром

Новичок
>Кстати, в статье по ссылке, которую привел Макс, тоже "вопрос риторический".

По-видимомому, он таковым и является. А учитывая get и set методы появившиеся в php5 удобнее использовать первый вариант. Ведь по сути варианты 2 и 3 используются именно для того чтобы ограничить досуп к переменным класса. В таком случае, зачем переписывать то что уже встроено в php.
Пишем $obj->value = 'foo';
и если в будущем понадобиться, перехватываем get/set внутри класса. Т.е. как вариант "для ленивых" он наиболее подходящий.
 

.des.

Поставил пиво кому надо ;-)
[DAN] к чему ссылка?
Полезность статьи примерно как советы курепина или "php за чашкой кофе"
 

demongloom

Новичок
Все зависит от религии.
В принципе можно через __get/__set спокойно перехватывать и спать спокойно, только одно плохо, что __get/set на распространяется на переменные класса. Он перехватывает несуществующие.
 

Frol

Новичок
demongloom
PHP:
class A {
  
  private $b;
  
  private function __set($var, $val) {
    var_dump(func_get_args());
  }
  
}

$a = new A();
$a->b = 1;
PHP 5.1
 

Profic

just Profic (PHP5 BetaTeam)
Frol
Fatal error: Cannot access private property A::$b in - on line 13
Edited: php 5.0.3.

-~{}~ 26.07.05 02:18:

Про это были долгие споры в internals, но они по-моему окончились в стиле надо сделать, но потом, когда-нибудь.
Edited: Это "когда-нибудь" таки наступило :) Спасибо за информацию.
 

Гравицапа

elbirret elcno
На сегодняшний день есть как минимум 3 (три) наиболее часто используемые возможности получить доступ к свойствам класса.

1) $this->property
2) $this->getProperty(); & $this->setProperty(value);
3) $this->get('property'); & $this->set('property', 'value');
в теме не заметил упоминания о таком способе
PHP:
class  TestClass 
{
    var $_val;    
    
    function Val($str = null) 
    {
        if (!is_null($str)) {
        	$this->_val = $str; 
        }
        
        return $this->_val;
    }
}

$obj = new TestClass;
$obj->Val('Hello, world');
echo $obj->Val();
 

SelenIT

IT-лунатик :)
Гравицапа

Прошу прощения, чем это принципиально отличается от способа 2?
 

texrdcom

Новичок
[DAN]
В классическом понимании protected свойств у php нет
Скажи конкретно чем тебя не устраивает protected ?.
А вообщем считаеться плохим тоном (не более !!!!) обращаться к свойствам класса $obj->t=1,
рекомендуют создавать get_ , set_
и если принять это за правило, то потом и не будет проблем в будущем. Вдруг будет надобность на тойже java что то написать.
p/s
То что ты нашел как раз про java :) и там описанны функции
getDsds() setDSDS() :)
 

bkonst

.. хочется странного?...
Пока PHP 4 еще не окончательно умер, имеет смысл пользоваться вторым методом - меньше проблем возникнет в том случае, если _вдруг_ потребуется проводить дополнительные проверки или вычисления при изменении переменной + более распространенный подход, чем третий.
 
Сверху