как правильнее передать параметры методу?

Uprinter

Новичок
как правильнее передать параметры методу?

Требуется передать методу некоторые данные для сохранения в базе.

Вопрос: как это правильнее сделать и в чем могут быть проблемы при том или ином способе?

PHP:
//Вариант 1 (самый простой)
$user = new user;
$user -> save("Name", "Age", "Phone");

//Вариант 2 (передаем объект)
$new_user -> name = "Name";
$new_user -> age = "Age";
$new_user -> phone = "Phone";
$user = new user;
$user -> save($new_user);

//Варинт 3 (а-ля ASP.NET)
//тут свойства объекта предполагаются открытыми, что по идее не есть правильно
$user = new user;
$user -> name = "Name";
$user -> age = "Age";
$user -> phone = "Phone";
$user -> save($user);
 

white phoenix

Новичок
Как удобнее так и делай, всё зависит от ситуации: если значения `name`, `age,` и `phone` нужны будут после их обработки методом save, и если объект отвечает только за один ряд, то я бы использовал третий вариант, а если в него поступает много рядов, и сохранять их не нужно, то первый.
 

zarus

Хитрожопый макак
PHP:
//Вариант 1.1 (продвинутый)
$user = new user;
$user->save(array('name'=>'<Name>','age'=>'<Age>','phone'=>'Phone',...));
Тогда можно будет задавать неограниченное количество входных параметров, не переписывая каждый раз уже существующий код, а только добавлять обработку новых пар входных данных внутри метода.

-~{}~ 26.12.05 09:42:

>> в чем могут быть проблемы при том или ином способе
Вариант 1: При добавлении новой входной переменной придется переписывать все вызовы этого метода.
Вариант 2: Слишком много лишних переменных и строк и кода.
Вариант 3: см. Вариант 2. Те же яйца, только вид сбоку.

А вообще, надо использовать такую вещь, как __construct()
PHP:
class User {
  public $name;
  public $age;
  public $phone;

  function __construct($params) {
     if (isset($params['name'])) {
       $this->name = $params['name'];
     }
     ...
  }
  ...
}
$user = new User(array('name'=>'<Name>','age'=>'<Age>','phone'=>'Phone',...));
 

Uprinter

Новичок
zarus, спасибо:)

Решил остановиться на варианте 2. Он мне кажется наиболее красивым, к тому же и возвращать юзера методом тоже планирую в объекте.
 

_RVK_

Новичок
>$user -> save($user);

ачепятка? ты собрался сохранять самого себя, передавая себя через параметры своего же метода?

-~{}~ 26.12.05 20:22:

$user = new user;
$user -> name = "Name";
$user -> age = "Age";
$user -> phone = "Phone";
$user -> save();

Вот ежели так то вполне. Второй вариант - лишний объект. Первый как и вариант zarus самый неудобный.
 

Uprinter

Новичок
_RVK_, да, ты правильно написал. Это я, конечно, ступил малость.

Ответы понятны, всем спасибо, тема закрыта.
 

zarus

Хитрожопый макак
Первый как и вариант zarus самый неудобный.
В чем же "неудобство" моего варианта? Просто интересно... а то в свете последней темы о хранении as is я тут чувствую преподношение ИМХО, как прописной истины :)
 

zarus

Хитрожопый макак
Автор оригинала: zerkms
zarus

потому что инкапсуляция. ты не должен передавать данные в массиве - представление и формат хранения объект выбирает сам и никому об этом говорить не должен
Других "против" нет? Если переменные класса открыты, то к чему фраза о "никому об этом говорить не должен"? А то, что я передаю все в массиве - так мне проще массив значений сформировать, чем писать при каждом вызове список присвоений. Аргументация за мой метод:
PHP:
$res = db_query('SELECT * FROM `users` WHERE `id` in (1,2,3)');
while (false !== ($row = db_fetch_assoc($res))) {
  $user = new User($row);
}
И если я решу добавить пару переменных, мне не надо будет прописывать в каждом таком куске кода новые строки, я просто поправлю функцию иницизализации класса.
з.ы. Это просто пример. Но у вас почему-то очень категоричное утверждение, что метод "неудобный". У каждого свое понятие о комфорте.

-~{}~ 27.12.05 09:20:

з.з.ы. Приму аргументацию, почему это неправильно. Но Вы же не всегда переходите дорогу на зеленый свет ^_^
 

_RVK_

Новичок
zarus
свете последней темы о хранении as is
я говорю что безусловно каждому решению можно найти применение. Но та тема к этой не имеет никакого отношения.

Почему неудобно? Потому что
1. Есои у тебя 30 параметров? Черт ногу сломит найти нужный.
2. Если значение некоторых зависят от условий.
3. Ты слышал о __get/__set? Это я ктому что тебе придется что-то там дописывать.
4. Если значения устанавливаются в нескользих методах.
5. Чисто с читабельной стороны неудобно.

Но, повторяю, все зависит от задачи. Для реализации паттерна ActionRecords удобнее, имхо третий вариант.
 

zarus

Хитрожопый макак
> 1. Есои у тебя 30 параметров? Черт ногу сломит найти нужный.
Не понимаю сути поиска нужного параметра?
> 2. Если значение некоторых зависят от условий.
Принято
> 3. Ты слышал о __get/__set? Это я ктому что тебе придется что-то там дописывать.
Слышал и пользовался, но как это относится к проблеме переписывания участков кода, где эти переменные класса вызываются/присваиваются?
> 4. Если значения устанавливаются в нескользих методах.
Почему эти методы не вызывать из метода, принимающего массив?
> 5. Чисто с читабельной стороны неудобно.
Согласен. Но мне неудобно писать $class->class_var = $row['somevar']; 10 раз, я лучше передам 1 единственный ассоциативный массив и разберу его уже в методе класса.

з.ы. А вообще, я рассматривал вариант, когда объекту присваивается множество значений в разлинчых кусках кода из некоего массива, который может изменить свою структуру (например, выборка SELECT * FROM), и который формируется автоматически. Естественно, формировать сначала массив, а потом передавать его в метод функции смысла нет. Да и вообще, это спор не конкретно для методов класса, а вообще о передаче параметров функции...
Я использую отдельные переменные для обязательных параметров и массив для дополнительных параметров, что дает мне некоторую гибкость при вызове функций - мне не надо вписывать значения по умолчанию для всех остальных доп.параметров и считать запятые.
 

_RVK_

Новичок
zarus
Нет, мы говорим о конкретном примере. Судя по нему автор реализует паттерн ActionRecords, и спрашивает как лучше устанавливать значения полей перед сохранением в БД. Вот конкретно для этого примера я высказываю свое ИМХО. А ИМХО основано на собственной реализации того-же, где мне вообще не нужно писать ни строчки кода для работы с различными таблицами. А как ты понимаешь, поля у таблиц разные. Вообщем-то внутри у меня формируется тот-же массив, что ты передаешь явно, только делают это __get/__set. Надеюсь мысль понятна?
 
Сверху