Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с переменными в классе 
:(
    Опции темы
Wowa
Дата 26.1.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Обращаетесь ли вы к переменными класса напрямую? Или же пользуетесь функциями get_variable и set_variable?
PM WWW   Вверх
Opik
Дата 26.1.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



Admin
напрямую. т.е
Код
$class->variable = 'new string';

PM MAIL Skype   Вверх
Wowa
Дата 26.1.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(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.
PM WWW   Вверх
Irokez
Дата 26.1.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 4
Всего: 53



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

PM   Вверх
Mal Hack
Дата 26.1.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



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
PM ICQ   Вверх
Wowa
Дата 26.1.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Mal Hack ну это понятно. Я немного другие имел ввиду.
PM WWW   Вверх
Mal Hack
Дата 26.1.2005, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



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

PM ICQ   Вверх
penizillin
Дата 26.1.2005, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 10.11.2004

Репутация: нет
Всего: 9



по разному, в зависимости от сложности приложения и многих других факторов. например, класс для работы с бд обслуживается исключительно вызовами методов. конечно, может быть это параноя, но я буду спокоен за сохранность данных. а насчет класса, обслуживающего некий элемент списка, имеющий несколько десятков свойств, бывает удобнее использовать группирование в массивы ($objMember->arrProperties['foo']).
PM MAIL ICQ   Вверх
Opik
Дата 27.1.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



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

И так далее. Часто это зависит от конкретной ситуации.
PM MAIL Skype   Вверх
borisvolfson
Дата 3.2.2005, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.2.2005

Репутация: нет
Всего: 3



На самом деле в идеале к полям класса нельзя обращаться напрямую, так как им можно присвоить некоректное значение, которое затем нарушит работу класса. Но в реальной жизни можно и нужно, так как при этом не происходит вызов функции, соответственно программа работает быстрее. Что касается, сложных систем, то тут лучше использовать функции...
PM MAIL   Вверх
<Spawn>
Дата 20.2.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



А какой 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;


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

Это сообщение отредактировал(а) <Spawn> - 20.2.2005, 19:00


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.