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?
może stworzyć funkcję ze zmienną liczbą parametrów
@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ć?
Albo zadeklaruj wszystkie metody bez parametrow a potem uzyj https://www.php.net/manual/en/function.func-get-args.php i już
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ść.
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...?
A nie walczysz z czymś, co by się załatwiło jakimś wzorem?
Zamiast zmiennej isty parametrów, obiekt ... strategia / inny ...
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.
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.
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