ООП свойства

Andrey_f

Новичок
ООП свойства

Мне нужно чтобы при изменении значения свойства класса, c новым значением автоматически выполнялись какие либо действия

во на пример на delphi я бы сделал так:

PHP:
MyClass class (TObject)
private 
   FTestString: String;
   function SetTestString(Value: String);
public
   property TestProp : String Read FTestString Write SetTestString;
End;

...

function MyClass.SetTestString(Value: String)
Begin
// делаю необходимые действия
...
   Self.FTestString=Value;
End;

т.е. конструкциями Read и Write я указываю какие действия делать при чтении и записи в значение свойства, при указании только одного из параметров (Read или Write) доступ к свойству будет соответственно только чтение или только запись. Как все это реализовать на PHP 5.

Почитал по __Get __Set меня чтото это совсем не устраивает, есть ли какие нибуть другие варианты?
 

xintrea

Новичок
> Мне нужно чтобы при изменении значения свойства класса, c новым значением автоматически выполнялись какие либо действия

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

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

Напрямую позволять устанавливать значения свойств - плохая практика.
 

Solid

Drosera anglica
Andrey_f
Например, PHP не Delphi. На Ruby тоже можно много чего сделать. В общем-то трезвые программисты пишут примерно так:

PHP:
class SomeClass {
   private $value = 0;

   public function getValue() {
      return $value;
   }

   public function setValue($value) {
      $this->value = $value;
   }

// ...
// ...
// ...
}
 

denver

?>Скриптер
Почитал по __Get __Set меня чтото это совсем не устраивает, есть ли какие нибуть другие варианты?
А чем не устраивает так?
PHP:
class MyClass {

  private $foo = 41;
  public $bar = 'www';

  function getFoo() {
    echo __FUNCTION__." was called<br/>";
    return $this->foo;
  }

  function __get($name) {
    // Property must be declared in class as non-public (better private)
    if (!isset($this->$name))
        throw new Exception("There is no such non-public property '$name'");
    // Getter fot the property must exist
    $getter = "get".ucfirst($name);
    if (method_exists($this, $getter))
        return $this->$getter();
    else
        throw new Exception("There is no '$getter()' for property '$name'");
  }

}
 

Andrey_f

Новичок
Автор оригинала: xintrea
> То есть для каждого свойства пишется геттер и сеттер, и значения свойств изменяется только через них.
А пример можно?


Solid

Я про свойства спрашиваю а ты мне методы предлогаеш


Автор оригинала: denver
А чем не устраивает так?
Вариант хороший но совсем для извращенцев :p Неужели нет ничего менее извращенного
 

HraKK

Мудак
Команда форума
Andrey_f
ООП на ПХП єто уже для извращенцев
 

hermit_refined

Отшельник
Я про свойства спрашиваю а ты мне методы предлогаеш
а чем методы-то не угодили?.. Чем $obj->property = $value; лучше $obj->setProperty($value); ?
на пример на delphi я бы сделал так
ну а на C++ бы тоже не сделали. ну и что теперь?..
 

demongloom

Новичок
Пускай человек сделает так как ему удобно и чтоб работало, со временем перепишет под "стиль".

Хотя ООП на ПХП местами большое извращение.
 

hermit_refined

Отшельник
Пускай человек сделает так как ему удобно и чтоб работало
дык вот незадача - ему никак не удобно. он хочет писать на php как на delphi. чего не пишет на delphi - загадка.

я вот, например, хочу на lisp писать, как на php. что делать?..
 

Solid

Drosera anglica
Andrey_f
ПрА метАды Вам прИдлагаю пАтАмучта так ДеЛаТь Нормальный ПрограммистЪ.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, а все, кто используют поля объектов - ненормальные.

я как-то спросил у Свидетеля Иеговы - если только они знают истину, и жизнь с верой в Христа единственно верная, то как же китайцы, индусы и мусульмане, т.е. большая часть жителей земли, неправы - и все у них хорошо?
человек реально задумался ...
 

Solid

Drosera anglica
grigori
Я отнюдь не говорил, что использование геттер/сеттер -- истина в последней инстанции, однако, это очень сильно облегчает жизнь (программисты кодят в первую очередь для других программистов, и потом уже для себя); к тому же человек просто не хочет мириться с тем, что так делают программисты, которые понимают что они делают; т.е. в общем-то если проводить параллель с вашим примером, то люди использующие прямой доступ к дата-членам -- люди, которые веруют просто от того, что так делают все (конечно, это понятно, что людям присущ конформизм... хотя, в общем-то, я стараюсь убедить, что с этим надо бороться).
В любом случае, подобная ветка уже есть... и я предлагаю переместиться туда. Ознакомиться со всеми возражениями и согласиями, ну и дальше уже написать отсебятину... и посмотреть на результат. В любом случае, форум конечно сила, но опыт... опыт то говорит, что интерфейс надо разрабатывать и нести, а не постоянно ломать и менять.
 

tf

крылья рулят
(программисты кодят в первую очередь для других программистов, и потом уже для себя)
хм, всегда cначало для себя и задумываюсь как мне потом если что полегче перделать - ты не прав :)
 

jonjonson

Охренеть
Andrey_f, как ты заявил
Мне нужно чтобы при изменении значения свойства класса, c новым значением автоматически выполнялись какие либо действия
В php 5 как и в объектном паскале, правда с некоторой существенной разницей есть методы __get() и __set().
В php 4 таковых нет и в место них обычно используются методы доступа.
Если тебя это не устраивает, то пиши на объектном паскале или другом языке. Обсуждение удобств обращения к свойствам напрямую вне рамок твоего вопроса.
 

boombick

boombick.org
хм, всегда cначало для себя и задумываюсь как мне потом если что полегче перделать - ты не прав
Я бы не сказал, что это плюс. Сейчас я очень сильно стал задумываться о читаемости и прозрачности собственного кода в первую очередь для других людей, которым с этим кодом придется работать. И, как результат, даже маленькие скрипты для собственного использования все равно аккуратно написаны, прокомментированы, и нет долгих размышлений, типа "и на фига я вот так тут делал?"...
 

tf

крылья рулят
boombick, наконецто :))
и нет долгих размышлений, типа "и на фига я вот так тут делал?"...
всеже и для себя стараещя ;)

я сказал сначало, так так считаю сначало систему надо cпроектировать нормально (несовместимость версий и т.д. т.п. как следствие) потом думать как дать ее поюзать остальным в полной мере, привести в нормальный вид
 
Сверху