[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передача последовательных агрументов
m4a1fox
Господа, вот такой вопрос меня взволновал...
Допустим, при инициализации класса, в качестве аргумента, у вас некая последовательность в передаче аргументов. Ну представим, что это строго... суть в поста в том, что бы понять такое можно или нет... я не к строгости призываю, а просто интересно (это я сразу, дабы вы не стали бросаться словами - "да нафиг этот бред :) "). Так вот. Один из этих последовательных аргументов, у вас определен по default. Так вот, если он не последний, как его можно передать???? Вот что я имею ввиду (код-пример):

<?php
class
Doing{
public $f;
public $s;
public $t;
public function __construct($first, $second = 'fox', $third){
$this->f = $first;
$this->s = $second;
$this->t = $third;
}
}

$obj = new Doing('Max', NULL, 'm4a1fox');
echo $obj->f;
echo '<br />';
echo $obj->s;
echo '<br />';
echo $obj->t;
?>


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

<?php
class
Doing{
public $f;
public $s;
public $t;
public function __construct($first, $third, $second = 'fox'){
$this->f = $first;
$this->s = $second;
$this->t = $third;
}
}

$obj = new Doing('Max', 'm4a1fox');
echo $obj->f;
echo '<br />';
echo $obj->s;
echo '<br />';
echo $obj->t;
?>


Как видите, при инициализации класса, передаются только 2 аргумента. Третий естественно - нет, как как он уже определен.

К чему все так усложнять?! К примеру, мне проще работать с чем либо, когда я знаю последовательность. К примеру: нужно передать параметры для загрузки фотки и созданию ее мини-копии таким образом: new Download (фото, папка, массив(ширина, высота), делать_уменьшенную, массив(ширина, высота)).
Но если по дефолту ставить папку, то есть не передавать ее как аргумент, то придется менять порядок, и так с любым аргументов получается... если он уже установлен, то его перемещаем в конец, а если их несколько? А нам нужно какой либо изменить?!



Спустя 4 минуты, 16 секунд (24.02.2012 - 14:19) Winston написал(а):
Есть правило, что все аргументы в ф-и нужно не по желанию расставлять, а по приоритету. А аргументы в которых уже есть дефолтное значение всегда должны стоять в конце.

Спустя 10 минут, 23 секунды (24.02.2012 - 14:29) m4a1fox написал(а):
Winston
Цитата
А аргументы в которых уже есть дефолтное значение всегда должны стоять в конце.

Ясно! Просто я думал, может способ какой есть еще.... А если у нас вот такая ситуация?

<?php
class
Doing{
public $f;
public $s;
public $t;
public function __construct($first, $third = 'm4a1fox', $second = 'fox'){
$this->f = $first;
$this->s = $second;
$this->t = $third;
}
}

$obj = new Doing('Max');
echo $obj->f;
echo '<br />';
echo $obj->s;
echo '<br />';
echo $obj->t;
?>

Как мне $second передать?

Или я уже загоняюсь?! :blink:

Спустя 2 минуты, 34 секунды (24.02.2012 - 14:32) Winston написал(а):
Цитата (m4a1fox @ 24.02.2012 - 13:29)
Как мне $socond передать?

Как вариант писать так
public function __construct($first, $third = 'm4a1fox', $second = 'fox'){
$this->f = $first;
$this->s = $second;
$this->t = !is_null($third) ? $third : 'm4a1fox';
}

$obj = new Doing('Max', null, 'test');

Спустя 3 минуты, 6 секунд (24.02.2012 - 14:35) m4a1fox написал(а):
Winston
Проверять ее.... ясно. Ну что ж, это хоть какой то выход. Спасибо.

Спустя 1 минута, 53 секунды (24.02.2012 - 14:37) killer8080 написал(а):
Цитата (Winston @ 24.02.2012 - 13:32)
$this->t = !is_null($third) ? $third : 'm4a1fox';

это лишнее smile.gif

Спустя 1 минута, 42 секунды (24.02.2012 - 14:39) Winston написал(а):
Цитата (killer8080 @ 24.02.2012 - 13:37)
это лишнее

Чуго? smile.gif

Спустя 4 минуты, 7 секунд (24.02.2012 - 14:43) killer8080 написал(а):
Winston
пардон, обшибся rolleyes.gif

Спустя (24.02.2012 - 14:43) m4a1fox написал(а):
killer8080
Норм!

Спустя 36 секунд (24.02.2012 - 14:43) killer8080 написал(а):
Цитата (m4a1fox @ 24.02.2012 - 13:43)
А как тогда выйти из ситуации? Мне, за скудностью ума и не опытности, ничего не приходит в голову. Winston, предложил условный оператор через тернарный проверять... пока что самое логичное....

Да, все правильно.

Спустя 4 минуты, 5 секунд (24.02.2012 - 14:48) m4a1fox написал(а):
Всем спасибо. Ответ найден.

Спустя 3 минуты (24.02.2012 - 14:51) vagrand написал(а):
Что-то я не понял в чем состоит проблема? Если у вас есть конструктор вида:
__construct($first, $third = 'm4a1fox', $second = 'fox')


и вам надо передать $second ну так делайте так:


$obj = new Doing('Max', 'm4a1fox', 'some_not_default_value');



Спустя 3 минуты, 42 секунды (24.02.2012 - 14:54) killer8080 написал(а):
Цитата (vagrand @ 24.02.2012 - 13:51)
и вам надо передать $second ну так делайте так:


$obj = new Doing('Max', 'm4a1fox', 'some_not_default_value');

во первых надо помнить/знать дефолтовые значения
во вторых если в будущем их нужно будет изменить, придется лопатить весь код, искать все вызовы и исправлять, а так все меняется в одном месте в декларации функции/метода.

Спустя 1 минута, 3 секунды (24.02.2012 - 14:55) caballero написал(а):
а еще можно тупо передать аргументы массивом и никаких забот
разве что не так читабельнo

Спустя 1 минута, 24 секунды (24.02.2012 - 14:57) m4a1fox написал(а):
vagrand
killer8080 правильно мысль выразил.
собственно
Цитата
во первых надо помнить/знать дефолтовые значения
во вторых если в будущем их нужно будет изменить, придется лопатить весь код, искать все вызовы и исправлять, а так все меняется в одном месте в декларации функции/метода.


Вот тут

$obj = new Doing('Max', 'm4a1fox', 'some_not_default_value');

Мне второй аргумент, а если конкретнее вот это ('m4a1fox'), не надо передавать. Без него нужно сделать. То есть по сути получается вот так

$obj = new Doing('Max', ????????, 'some_not_default_value');

Что нужно написать вместо знаков вопроса, что бы сработало условие из конструктора.

$third = 'm4a1fox'

Спустя 1 минута, 16 секунд (24.02.2012 - 14:58) m4a1fox написал(а):
caballero
Цитата
а еще можно тупо передать аргументы массивом и никаких забот

Да, так тоже можно, а потом просто их вытаскивать. Интересно, легче как передать... ассоциативно или нет.... наверно нет... но ассоциативно читабельнее чуточку будет.

Спустя 1 минута, 27 секунд (24.02.2012 - 14:59) caballero написал(а):
Цитата
Что нужно написать вместо знаков вопроса, что бы сработало условие из конструктора.

можно null передать а потом проверять если Null то параметр игнорируем

Спустя 39 секунд (24.02.2012 - 15:00) m4a1fox написал(а):
caballero
Цитата
можно null передать а потом проверять если Null то параметр игнорируем

Ну да. К этому Винстон подвел на первой страницы. Условный через тернарный.

Спустя 17 секунд (24.02.2012 - 15:00) killer8080 написал(а):
Цитата (m4a1fox @ 24.02.2012 - 13:58)
Интересно, легче как передать... ассоциативно или нет

Конечно ассоциативный массив, иначе смыла нет. Тогда можно вообще аргументы не объявлять.

Спустя 9 минут, 32 секунды (24.02.2012 - 15:10) m4a1fox написал(а):
killer8080
А пример? Я с массивом...

<?php
class
Doing{
public $f;
public $s;
public $t;
public function __construct($ar = array()){
$this->f = $ar['first'];
$this->s = $ar['second'];
$this->t = $ar['third'];
}
}

$obj = new Doing(array('first'=>'Max', 'second'=>'m4a1', 'third'=>'fox'));
echo $obj->f;
echo '<br />';
echo $obj->s;
echo '<br />';
echo $obj->t;
?>

Это понятно.... а как если нет например второго ключа

Спустя 2 минуты, 27 секунд (24.02.2012 - 15:12) killer8080 написал(а):
Цитата (m4a1fox @ 24.02.2012 - 14:10)
Это понятно.... а как если нет например второго ключа

обычная проверка тернарным оператором на наличие ключа, если нет, втыкаем значение по дефолту.

Спустя 1 минута, 31 секунда (24.02.2012 - 15:14) m4a1fox написал(а):
killer8080
Ясно... я думал как-то сложнее.... по сутиполучается тоже самое что и Винстон в начале предложил. Так?

Спустя 1 минута, 39 секунд (24.02.2012 - 15:15) caballero написал(а):
Цитата
но ассоциативно читабельнее чуточку будет.

не только читабельнее - у тебя как раз и будет возможность передавать параметры в произвольных комбинациях

Спустя 1 минута, 35 секунд (24.02.2012 - 15:17) m4a1fox написал(а):
caballero
Цитата
у тебя как раз и будет возможность передавать параметры в произвольных комбинациях

Верно. Чет не подумал об этом сразу.

Спустя 4 минуты, 15 секунд (24.02.2012 - 15:21) killer8080 написал(а):
m4a1fox
ещё бывают ситуации, когда нужно передать список каких нибудь значений. Обычно делают так
function test($values = array()){
...
}
test(array('first', 'second', 'third'));

а можно и так, более читабельный вариант

function test(){
$values = func_get_args();
...

}
test('first', 'second', 'third');

Спустя 15 минут, 28 секунд (24.02.2012 - 15:37) m4a1fox написал(а):
killer8080
О! Спасибо! Буду знать на будущее.

Спустя 16 минут, 49 секунд (24.02.2012 - 15:54) caballero написал(а):
m4a1fox

А шо, Метт Зандстра как передавать параметры не рассказывает? biggrin.gif
Типа не царское дело.

Спустя 14 минут, 49 секунд (24.02.2012 - 16:08) m4a1fox написал(а):
caballero, запомнили.... smile.gif Да он рекомендует передавать класс как аргумент, а в этом классе производить инициализацию.... короче как-то сложно у него все...

Спустя 19 часов, 23 минуты, 9 секунд (25.02.2012 - 11:32) bodja написал(а):
m4a1fox
public function __construct($ar1=1,$ar2=2,$ar3=3)

$obj = new Doing(,,'m4a1fox')

Спустя 31 минута, 58 секунд (25.02.2012 - 12:04) m4a1fox написал(а):
bodja
Да ладно! blink.gif

И Ошибки не будет?

Спустя 54 минуты, 12 секунд (25.02.2012 - 12:58) bodja написал(а):
m4a1fox
Проверте wink.gif

Спустя 3 часа, 32 минуты, 54 секунды (25.02.2012 - 16:31) killer8080 написал(а):
Цитата (bodja @ 25.02.2012 - 11:58)
m4a1fox
Проверте

чего там проверять? Это же PHP wink.gif
Цитата
Parse error: syntax error, unexpected ',', expecting ')'

Спустя 47 минут, 21 секунда (25.02.2012 - 17:18) bodja написал(а):
killer8080
Да это я фигню спорол ,не обращай внимания,
походу вспомнил одну функцию ,где подобное можно было вытворять.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.