LINUX.ORG.RU

PHP и функции с необязательными аргументами

 , ,


0

2

Допустим, есть функция

function func($a, $b, $c, $d=0, $e=1, $f='', $g=null)
{...}
Как ей передать параметры $a, $b, $c, $d и $g, без $e и $f?
Насколько помню, это делалось так:
func(1, $var, 6, 1, $g=$obj)
Но нет
Погуглил - ничего
Не работает и это:
func(1, $var, 6, $d=1, $g=$obj)
Как быть?

★★★★

Как быть?

Вариантов решения масса на вкус и цвет. Начиная от простейшей передачи массива или stdClass с нужными свойствами и заканчивая обёрткой всего этого дела в call chain и просто классы.

resurtm ★★★ ()
Ответ на: комментарий от resurtm

Кстати, сопутствующий вопрос - а можно передать произвольное количество параметров функции? Не в виде массива а типа как:
proc myProc {a, b, args} {}
Т.е. а это a, b это b, а args - прочие параметры которые подцепятся как массив, за неимением списков.

В том смысле что вызов будет каким-то таким myProc $a $b $c $d

Suntechnic ★★★★★ ()
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от resurtm

В PHP такого нет, есть только в Python.

Значит, пора память лечить... То-то гуглеж ничем не помог

alix ★★★★ ()

сделать можно при помощи func_get_args(), но если вам это нужно, значит вы делаете что-то не так

heisenberg ★★ ()
Ответ на: комментарий от resurtm

Ага, спасибо. Просто никогда не задавался вопросом - не надо было. А тут интересно стало. А вот в более других языках надо было ни раз. К чему бы это?

Suntechnic ★★★★★ ()
Ответ на: комментарий от resurtm

Наверное потому что PHP итак по самые гланды динамичен

Да, да, динамичный, только в шаг сторону и уже нужен eval.

anonymous ()
Ответ на: комментарий от Debasher

Ну что? Расскажешь мне, что РНР убог, потому что ты не осилил его?

ihappy ()
Ответ на: комментарий от resurtm

Тысячи их. Начиная от манкипатчинга, заканчивая обертками для отложенной загрузки классов.

Отсутствие потребностей в настоящей динамике характеризует вас как недалекого специалиста, короче былдлокодеришко ты, на быдлоязычке.

anonymous ()
Ответ на: комментарий от ihappy

Что я не так делаю?

1) Нагло врешь и не краснеешь.

2) Вообще не пишешь код

3) Пользуешься фреймворками, в которых умные дяди пытаются обойти ограничения PHP за тебя, сирого и убогого.

anonymous ()
Ответ на: комментарий от anonymous

1. Не вру. 2. Пишу. 3. Пользуюсь конечно, свои велосипеды не люблю, для этого и нужны фреймворки.

евал очень редко нужен и всегда можно найти способ, как не юзать его.

ihappy ()

Как быть?

зачем может понадобится такой быдлокод, и как интерпретатор определит, какие параметры ты передал? В сишечке можно хотя-бы тип описать, а тут как?

drBatty ★★ ()
Ответ на: комментарий от anonymous

Гадание на кофейной гуще, как и вангование, это не моя сильная сторона. Конкретней скажи, что ты хочешь услышать?

ihappy ()
Ответ на: комментарий от anonymous

Начиная от манкипатчинга

У вас что-то не так с подходами и архитектурой. Никогда особенно сильно monkey patching не нужен был.

заканчивая обертками для отложенной загрузки классов

Это делается не через eval. Почитай про autoload.

Отсутствие потребностей в настоящей динамике характеризует вас как недалекого специалиста

Ну, я eval как раз так и юзаю, но юзаю когда очень сильно нужно, а иных способов-то и нет. :-)

короче былдлокодеришко ты, на быдлоязычке

Привет, Гослинг!

resurtm ★★★ ()
Ответ на: комментарий от Suntechnic

Т.е. а это a, b это b, а args - прочие параметры которые подцепятся как массив, за неимением списков.

в php есть списки. Зачем их велосипедить?

drBatty ★★ ()
Ответ на: комментарий от anonymous

Если PHP так динамичен, зачем нужен runkit?

Понятия не имею. Может быть чтобы мочить (mock) стандартные функции и классы? Только оно мне никогда не нужно было — у меня свои обёртки нормальные, которые можно в любой момент расширить/замочить.

resurtm ★★★ ()
Ответ на: комментарий от ihappy

ни разу евал не юзал. Что я не так делаю?

ты просто знаешь свой инструмент и используешь его по назначению.

drBatty ★★ ()
Ответ на: комментарий от anonymous

3) Пользуешься фреймворками, в которых умные дяди пытаются обойти ограничения PHP за тебя, сирого и убогого.

А я вот кстати пишу Yii и им же пользуюсь. Я тогда и умный дядя и тупой быдлокодер одновременно, дорогой Хейльсберг? :-)

resurtm ★★★ ()
Ответ на: комментарий от resurtm

Ну, я eval как раз так и юзаю, но юзаю когда очень сильно нужно, а иных способов-то и нет.

уверен, что правильно выбрал ЯП?

drBatty ★★ ()
Ответ на: комментарий от drBatty

зачем может понадобится такой быдлокод

Это же очевидно по вопросу - если в $e и $f нужно оставить значения по умолчанию.

alix ★★★★ ()
Ответ на: комментарий от drBatty

уверен, что правильно выбрал ЯП?

Ну, я ещё пишу на CoffeeScript + JavaScript, немного на Ruby и немного на Python. :-)

resurtm ★★★ ()
Ответ на: комментарий от ihappy

Приведи PHPшный аналог без runkit и eval.

def make_class_that_says(string):
    class Cls:
        def say(self):
            print(string)

    return Cls

make_class_that_says('Moo')().say()
make_class_that_says('Boo')().say()

def nya_say(self):
    print('Nya. ', end='')
    self.__class__.say(self)

nya = make_class_that_says('Bar')()
nya.say = nya_say.__get__(nya)
nya.say()

anonymous ()
Ответ на: комментарий от drBatty

каноничный Ъ пример убогости пхп, в котором нет функций с переменным числом параметров

Воспринимай func_get_args() как *kwargs и *args и всё будет прекрасно. :-)

resurtm ★★★ ()
Ответ на: комментарий от alix

Это же очевидно по вопросу - если в $e и $f нужно оставить значения по умолчанию.

ИМХО сами значения по умолчанию — признак плохого стиля. Как goto, я не против его, но когда пихают goto во все щели — это быдлокод. Как и параметры по умолчанию. А вот ты именно так и делаешь, раз тебе это так нужно. Ничего личного, и ещё раз — ИМХО.

drBatty ★★ ()
Ответ на: комментарий от drBatty

ИМХО сами значения по умолчанию — признак плохого стиля

В данном случае использование оправдано: есть функция, принимающая N аргументов, она использована в таком виде в нескольких местах. А тут понадобилось, чтобы она принимала N+1, потому что сразу об этом не подумали. Причем видимо это повторилось несколько раз.

alix ★★★★ ()
Ответ на: комментарий от resurtm

Это делается не через eval. Почитай про autoload.

Ох, ЛОЛ, меня еще учить будут как грузить классы. А если формально нужен только экземпляр, хотя его методы не вызываются на протяжении запроса.

anonymous ()
Ответ на: комментарий от resurtm

В принципе в C и C++ все эти va_list, va_start, va_end и т.п. — не меньший костыль.

абсолютно верно!

То, что в «старших» ЯП есть такие же костыли — не повод их постоянно юзать. Согласись, что эта твоя merge (https://github.com/yiisoft/yii2/blob/master/yii/helpers/base/ArrayHelper.php#... ) штука довольно-таки опасная IRL, не? Явная плохо предсказуемая дыра, сквозь которую что-то может утечь.

drBatty ★★ ()
Ответ на: комментарий от drBatty

Явная плохо предсказуемая дыра, сквозь которую что-то может утечь.

Вы/ты, насколько я понял, адепт и сторонник Python. Так вот, в Python возможностей прострелить себе ногу не меньше. Согласись?

resurtm ★★★ ()
Ответ на: комментарий от resurtm

Да Линус-то вообще главный говнокодер планеты! :-D

ты по ссылке ходил? Читал? Прочитай, раз Ъ:

I'm REALLY opposed to the use of the word «goto» in any code where it's not needed.

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

drBatty ★★ ()
Ответ на: комментарий от alix

В данном случае использование оправдано: есть функция, принимающая N аргументов, она использована в таком виде в нескольких местах. А тут понадобилось, чтобы она принимала N+1, потому что сразу об этом не подумали. Причем видимо это повторилось несколько раз.

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

а за что они деньги получали? Да ещё и несколько раз?

drBatty ★★ ()
Ответ на: комментарий от drBatty

ИМХО сами значения по умолчанию — признак плохого стиля.

Чем плох стиль, если функция для большинства случаев использования имеет стандартные настройки? Именованные аргументы (то, что хочет ТС) — дальнейшее развитие этой идеи.

staseg ★★★★★ ()
Ответ на: комментарий от anonymous

А если формально нужен только экземпляр

вроде для этого интерфейсы придумали, не? (я, если честно, сам не в курсе этого нового слова в php)

drBatty ★★ ()
Ответ на: комментарий от drBatty

вроде для этого интерфейсы придумали, не?

Ортогонально. Нужен объект, которому в определенных ситуациях надо проделегировать работу. А чтобы не грузить этот код каждый раз делается обертка.

Или надо разорвать циклическую зависимость, если используется какой-нибудь DI.

anonymous ()
Ответ на: комментарий от resurtm

Вы/ты

я тут один. ☺

насколько я понял, адепт и сторонник Python

нет. Я адепт и сторонник сишечки. Проблема в том, что писать хомпэйдж на сишечке — маразм. А питон ИМХО годный ЯП (в своей нише).

Так вот, в Python возможностей прострелить себе ногу не меньше. Согласись?

прострелить ногу можно в _любом_ ЯП. Но в питоне заметить и вылечить простреленную ногу проще. Да и прострелить сложнее. Это конечно не голая сишечка, а такой ОБЧР, бронированный. А этот ваш ПХП тоже БЧР, только ещё и с интеллектом, если ему сказать «нога/стрелять», то он разнесёт сначала свои ноги, потом твои, а потом пойдёт дальше, как ни в чём не бывало, искать другие ноги. ☺ И самое печальное, что его не волнует, что с отстреленными ногами понятие «ходить» не имеет никакого смысла.

drBatty ★★ ()
Ответ на: комментарий от drBatty

И самое печальное, что его не волнует, что с отстреленными ногами понятие «ходить» не имеет никакого смысла.

Самое печальное, что в языке для веба (!!!) поддержка юникода сделана через жопу. Остальное можно и потерпеть, и слабую типизацию и кривую стандартную библиотеку.

anonymous ()
Ответ на: комментарий от anonymous

Ортогонально. Нужен объект, которому в определенных ситуациях надо проделегировать работу. А чтобы не грузить этот код каждый раз делается обертка.

ИМХО, если нет поддержки разделяемых и подключаемых модулей, то её НЕТ. И костылять их глупо. Если у тебя домашняя страничка, то эти модули тебе и не нужны, а если какой-то огромный проект, то юзать php - нерационально. Я не прав?

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.