Wymuszanie implementacji metody o konkretnej nazwie ale bez specyfikacji listy argumentów

0

Czy w PHP da się stworzyć interface lub klasę abstrakcyjną, która wymuszałaby implementację metody jednak nie wymuszałaby tego jakie konkretnie parametry mają być przekazywane w tej metodzie?

2

może stworzyć funkcję ze zmienną liczbą parametrów

0

@Miang:
Zrobiłem tak :

namespace App\Handlers;


Abstract Class BaseHandler {
    public abstract function handle(...$params);
}

Klasa dziedzicząca

Class AddMovieLikeHandler extends BaseHandler {

    public function handle(AddMovieLikeRequest $request) : Response{

No i krzyczy mi, że jest niezgodność. Jest możliwość inaczej to zapisać?

1

Albo zadeklaruj wszystkie metody bez parametrow a potem uzyj https://www.php.net/manual/en/function.func-get-args.php i już

1

@Mostek:

Da się.

interface BarInterface
{
    public function testFunction();
}

class FooClass implements BarInterface
{
    public function testFunction(string $string = null, string $anotherString = null)
    {
        return $string;
    }
}

$foo = new FooClass();
var_dump($foo->testFunction('test'));

Tylko pamiętaj, że funkcja w interfejsie nie może mieć zdefiniowanych parametrów, inaczej rzuci niezgodność.

0

Zrobiłem mały test i wyszło mi coś takiego. To nie działa : niezgodność z interface'm.

interface Test {
    public function foo();
}

class TestingInterface implements Test {
    public function foo(int $param1, int $param2){
        return $param1 + $param2;
    }
}

$x = new TestingInterface();
echo $x->foo(2,3);

A z kolei to działa.

interface Test {
    public function foo();
}

class TestingInterface implements Test {
    public function foo(int $param1 = null, int $param2 = null){
        return $param1 + $param2;
    }
}

$x = new TestingInterface();
echo $x->foo(2,3);

I to też działa.

interface Test {
    public function foo();
}

class TestingInterface implements Test {
    public function foo(int $param1 = 4, int $param2 = 3){
        return $param1 + $param2;
    }
}

$x = new TestingInterface();
echo $x->foo(2,3);

Dziwi mnie takie zachowanie. Czemu bez wartości domyślnych krzyczy, że nie zgadza się a z wartościami domyślnymi już jest git...?

1

A nie walczysz z czymś, co by się załatwiło jakimś wzorem?
Zamiast zmiennej isty parametrów, obiekt ... strategia / inny ...

1

Jak zrobisz coś w stylu function x($a = null, $b = null, $c = null) to może i zadziała, ale jak będziesz chciał podać w wywołaniu tylko trzeci argument, to musisz użyć x(null, null, 'abcd'. Trochę bez sensu. Ale PHP od wersji 8.0 masz takie coś jak named paremeters, co znacznie to może ułatwić.

Możesz też np. zrobić coś takiego:

class MyRequest() {
  $x = null;
  $y = null;
  $z = null;
}

function x(MyRequest $request) {..};

$request = new MyRequest();
$myRequest->z = 'abcd';
x($request);

Używanie czegoś w stylu func_get_args jest mało czytelne i ogólnie nie polecam.

0
serek napisał(a):

Jak zrobisz coś w stylu function x($a = null, $b = null, $c = null) to może i zadziała, ale jak będziesz chciał podać w wywołaniu tylko trzeci argument, to musisz użyć x(null, null, 'abcd'. Trochę bez sensu. Ale PHP od wersji 8.0 masz takie coś jak named paremeters, co znacznie to może ułatwić.

Możesz też np. zrobić coś takiego:

class MyRequest() {
  $x = null;
  $y = null;
  $z = null;
}

Można to zrobić jeszcze abstrakcyjniej: może to być klasa stdClass bez określonych właściwości - czyli dowolna lista właściwości, można też użyć po prostu tablicy - tyle, że od takich rzeczy kod później staje się nieczytelny i zagmatwany.

0
TomRZ napisał(a):

Można to zrobić jeszcze abstrakcyjniej: może to być klasa stdClass bez określonych właściwości - czyli dowolna lista właściwości, można też użyć po prostu tablicy - tyle, że od takich rzeczy kod później staje się nieczytelny i zagmatwany.

AnyKtokolwiek napisał(a):

A nie walczysz z czymś, co by się załatwiło jakimś wzorem?

Zamiast zmiennej isty parametrów, obiekt ... strategia / inny ...

Jeśli wywołanie ma "coś wspólnego" (bo ma być dziedziczone), to owa "klasa z opakowanymi argumentami" (nazwana tu chyba słusznie value object) też "coś" ma wspólnego, nie jest projektowo totalnie nieokreślona , ale może dziedziczyć ze wspólnego przodka
@jurek1980 dałeś mi kciuka, rozumiesz co piszę?

A kol @Mostek uparcie o implementacji, a nie o tym, jaki problem rozwiązuje. Nie wiedząc, nawet można mniemać, że to dziedziczenie Pies extends Głowa albo Koszyk exteds Jabłko

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