Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Работа с переменными в классе


Автор: Wowa 26.1.2005, 17:44
Обращаетесь ли вы к переменными класса напрямую? Или же пользуетесь функциями get_variable и set_variable?

Автор: Opik 26.1.2005, 17:49
Admin
напрямую. т.е
Код
$class->variable = 'new string';

Автор: Wowa 26.1.2005, 17:58
Цитата(Opr @ 26.1.2005, 15:49)
$class->variable = 'new string';


Вроде ведь это считается не совсем правильным в ООП. Приведу пример:
Есть класс, который отвечает за данные какого-то клиента какого-то банка.

Код

class client {
//Денежный баланс клиента
var $balance=500;

function get_balance() {
return $this->balance;
}

function set_balance($new_value) {
$this->balance=$new_value;
}

}

//Увеличиваем баланс на 300 евро
$client = new client();
$balance=$client->get_balance();
$balance+=300;
$client->set_balance($balance);



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

Код

...
$client = new client();
$client->balance+=300;


Тут я конечно понимаю, что переменная $balance объявлена, как public в классе(в ПХП5 это стало возможно, а var=public). Но все же, я могу ее private сделать. Согласно всяким рекомендациями в книжках так было бы правильнее.


Итак. Какой подход все-таки правильнее и почему?
Добавлено @ 17:59
Кроме того, если в классе 20 переменных, то не писать ведь на каждую по две функции get и set.

Автор: Irokez 26.1.2005, 18:42
по-моему, если переменная класса является public, то к ней стоит обращаться напрямую ($class->var), а если как private или protected, то стоит написать два метода для обращения и изменения таких переменных ($class->getVar($var_name)), $class->(setVar($var_name, $value))

Автор: Mal Hack 26.1.2005, 21:34
Admin
$obj = & new ClassName()
$obj -> property, где property объявлена через var как pibluc (в PHP5).
Т.е.
$obj -> property = 5;
print $obj -> property;

Внутри класса можно использовать обращение $this ->, т.е.
Есть метод asd();
В нем
{
$this - property = 5;
}

Вызываем метод $Obj -> asd();
print $obj -> property;
выведет 5.
использование $this в PHP 5 необхожимо для private & protected

Автор: Wowa 26.1.2005, 21:43
Mal Hack ну это понятно. Я немного другие имел ввиду.

Автор: Mal Hack 26.1.2005, 21:52
Admin
Скажи, а зачем писать 2 функции, если можно просто присвоить переменной значение?
Смысл?
Это не может быть правильным. Это нагрузка на скрипт, причем лишняя...

Автор: penizillin 26.1.2005, 21:55
по разному, в зависимости от сложности приложения и многих других факторов. например, класс для работы с бд обслуживается исключительно вызовами методов. конечно, может быть это параноя, но я буду спокоен за сохранность данных. а насчет класса, обслуживающего некий элемент списка, имеющий несколько десятков свойств, бывает удобнее использовать группирование в массивы ($objMember->arrProperties['foo']).

Автор: Opik 27.1.2005, 01:08
Возьму мануал по PHP5:
http://ee.php.net/manual/en/language.oop5.overloading.php
Код
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;

И так далее. Часто это зависит от конкретной ситуации.

Автор: borisvolfson 3.2.2005, 02:37
На самом деле в идеале к полям класса нельзя обращаться напрямую, так как им можно присвоить некоректное значение, которое затем нарушит работу класса. Но в реальной жизни можно и нужно, так как при этом не происходит вызов функции, соответственно программа работает быстрее. Что касается, сложных систем, то тут лучше использовать функции...

Автор: <Spawn> 20.2.2005, 18:54
А какой PHP собирается использоваться? Если 5, то:

Код

class some_class
{
 const PROP_VALUE = "value";

 private $f_value;

 private function get_value()
 {
   return $this->f_value;
 }

 private function set_value($new_value)
 {
   $this->f_value = $new_value;
 }

 public function __get($name)
 {
   switch ($name)
   {
     case self::PROP_VALUE: return $this->get_value(); //return $this->f_value, для работы без функций
   }
 }

 public function __set($name, $value)
 {
   switch ($name)
   {
     case self::PROP_VALUE: $this->set_value($value); //$this->f_value = $new_value, для работы без функций
   }
 }
}


Использование:

Код

$class_instance = new some_class();
$class_instance->value = 10;


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)