Допустим, при инициализации класса, в качестве аргумента, у вас некая последовательность в передаче аргументов. Ну представим, что это строго... суть в поста в том, что бы понять такое можно или нет... я не к строгости призываю, а просто интересно (это я сразу, дабы вы не стали бросаться словами - "да нафиг этот бред :) "). Так вот. Один из этих последовательных аргументов, у вас определен по 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'; |
это лишнее

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

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

Спустя (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 написал(а):
Что-то я не понял в чем состоит проблема? Если у вас есть конструктор вида:
и вам надо передать $second ну так делайте так:
__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
разве что не так читабельнo
Спустя 1 минута, 24 секунды (24.02.2012 - 14:57) m4a1fox написал(а):
vagrand
killer8080 правильно мысль выразил.
собственно
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
А шо, Метт Зандстра как передавать параметры не рассказывает?
Типа не царское дело.
А шо, Метт Зандстра как передавать параметры не рассказывает?

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

Спустя 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
Да ладно!
И Ошибки не будет?
Да ладно!

И Ошибки не будет?
Спустя 54 минуты, 12 секунд (25.02.2012 - 12:58) bodja написал(а):
m4a1fox
Проверте
Проверте

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

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