PHP przekazywanie argumentów

0

Chce zrobić funkcję, która nie będzie wymagała w wywoływaniu jej przekazywać wszystkie argumenty.
Czyli, że jak mam np funkcję z dwoma argumentami a,b to będę mógł przekazać np. tylko a albo tylko b

Taki zapis nie działa:

function Test(a, b) {}

Test(a = 1);

i taki też nie

function Test(a = NULL, b = NULL) {}

Test(a = 1);

Jak to zrobić?

0

No ale wiesz, żę w php używa się dolara jako zmiennej?

http://sandbox.onlinephpfunctions.com/code/4ae0fb553d94beffed79e100f5bac0d226d4a72e

jak dla mnie wszystko działa.

0
Pabloss napisał(a):

No ale wiesz, żę w php używa się dolara jako zmiennej?

http://sandbox.onlinephpfunctions.com/code/4ae0fb553d94beffed79e100f5bac0d226d4a72e

jak dla mnie wszystko działa.

ups... znaczy z tymi dolarami tylko tutaj przez przypadek nie napisałem. Z tym sposobem mam problem gdy podam np.

test($a = 1);

to wszystko działa, ale jak podam tak:

test($b = 1);

to wtedy nie działa

0

możesz np. przekazać tablice jak argument


function fun($params = ['a'=> null, 'b'=>null]) {
}

Łatwiej ci będzie pomóc jak powiesz co chcesz osiągnąć

0

Nie ma takiej konstrukcji w PHP.
Co próbujesz osiągnąć?

0

nie da się pominąć wcześniejszych parametrów i przekazać sobie tylko wybrane. Jaki masz problem bo na bank źle do tego podchodzisz.

0

Można i tak:

function test()
{
    $args = func_get_args();
    return print_r($args, true);
}

$test2 = function()
{
    $args = func_get_args();
    return json_encode($args, JSON_PRETTY_PRINT);
};

echo test();
echo $test2(2, 5, 6);
echo call_user_func_array('test', array('foo', 'bar'));

Czyli zasadniczo func_get_args pobiera parametry funkcji jako tablica a tu są takie 3 przykładowe sposoby na zabawy z takimi przykładowymi funkcjami.

Array
(
)
[
    2,
    5,
    6
]Array
(
    [0] => foo
    [1] => bar
)

1

A nie możesz po prostu (jeżeli już musi być taka konstrukcja) zrobić sobie funkcji foo(a=null,b=null) i przekazywać potem foo(NULL,$argument) dając nulla tam gdzie nie potrzebujesz argumentu?
Eg:

function foo($a=NULL,$b=NULL)
{
    print 'A:'.$a;
    print 'B:'.$b;
}

foo(NULL,'test');

Czy ja coś źle zrozumiałem w tym poście..?

PS: Chyba że zawsze musisz przekazać tylko jeden argument do funkcji zawierający więcej niż jeden potrzebny Ci element, to rzeczywiście rozwiązanie z tablicą będzie lepsze.

1

Mi się wydaje, że OP chce zrobić coś, co w Pythonie nazywa się **kwargs. W PHP nie bardzo da się to osiągnąć. Jak zrobisz $a = 5, to funkcja nie ma pojęcia, że pierwszy argument to a. Wyrażenie $a = 5 zwraca 5, więc:

foo($a = 5, $c = 20);

to jest to samo, co:

foo(5, 20);

Z punktu widzenia funkcji foo nie ma to znaczenia. Jedyne, co możesz zrobić, to coś takiego:

function foo($a = null, $b = null, $c = null) {
    // jeżeli pierwszy argument to tablica, to tworzymy zmienną korzystając z konstrukcji $$nazwa
    if (is_array($a)) {
        foreach ($a as $name => $value) {
            $$name = $value;
            // jezeli mamy zmienną $test = 'foo'; i zrobimy $$test = 5; to utworzymy zmienną o nazwie zmiennej $test i wartości 5
            // JEST TO CHOLERNIE NIECZYTELNE w mojej opinii
            // Explicit is better than implicit.
        }
    }

    var_dump($a, $b, $c);
};

foo(['a' => 5, 'c' => 15]);
foo(5, null, 15);
foo(5, 10, 15);

Osobiście myslę, że jest to fatalne rozwiązanie i jeżeli masz już taką sytuację, że nie chcesz przekazać jednego arugmentu to:

  1. Zmień ich kolejność. Pierwsze argumenty niech będą wymagane, opcjonalne na koniec.
  2. Jezeli masz taką funckję, to może ona za dużo robi? Może trzeba podzielić ją na dwie mniejsze, z których każda robi jedną rzecz?
  3. Błagam Cię nie używaj tego kodu, który Ci wyżej podałem. Napisałem go tylko w celach edukacyjnych :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1