• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa abstrakcyjna php

Object Storage Arubacloud
0 głosów
494 wizyt
pytanie zadane 31 lipca 2018 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)

Witam,

stworzyłem klasę abstrakcyjną:

abstract class  Wzor {

    public $parametr;

    function __construct()
    {

    }

    public function wykonaj($parametr) {
      
    }

Na jej podstawie chcę stworzyć klasy potomne, które różnią się jedynie $parametr w funkcji wykonaj(). W jaki sposób dla każdej klasy dziedziczącej po klasie abstrakcyjnej Wzor.php można to podstawić?

Próbowałem m.in. w klasie potomnej przez przypisanie 

public $parametr = 'wartosc';

Ale nie podstawia tej wartości przy wywołaniu metody wykonaj() na obiekcie klasy potomnej. Tylko muszę ją zawsze podać przy wywoływaniu metody.

Czy wiecie, jak można tego dokonać?

1 odpowiedź

+1 głos
odpowiedź 31 lipca 2018 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie zrobisz tego w taki sposób. Skoro zmienną $parametr przekazujesz z zewnątrz to po prostu musisz odpowiednią przekazać przy wywołaniu tej metody na zewnątrz. Można też w konkretnej implementacji (klasie która dziedziczy po Wzor) zadeklarować np. konstruktor albo zrobić setter i ustawiać właściwość. Albo zmienić tak, aby ten parametr nie był argumentem metody a właściwością klasy, wtedy będziesz sobie mógł deklarować tak jak pokazałeś jako nadpisanie właściwości. Wszystko zależy od kontekstu i tego co chcesz zrobić, przeważnie nie ma jednego rozwiązania tylko na wiele sposobów można do tego podejść.
komentarz 31 lipca 2018 przez Adam Ostrogórski Obywatel (1,070 p.)

Rozumiem. Dzięki.

Czyli jeśli chciałbym stworzyć klasy potomne dziedziczące po Wzór, które różnią się jedynie parametrem w metodzie wykonaj(), to jest to możliwe do zrobienia, czy nie powinienem tworzyć klasy abstrakcyjnej, tylko zwykłą, ponieważ i tak trzeba będzie przy tworzeniu obiektu podać ten parametr? 

Jeśli jednak jest możliwe ustawienie w klasach potomnych innych wartości tego parametru przekazywanego do metody, to poprzez przypisanie wartości w konstruktorze powinno to wyglądać w ten sposób:

class Potomna extends Wzor {

    public $parametr;

    function __construct()
    {
        $this->parametr= 'wartosc';
    }

    public function wykonaj($parametr) {
        
    }


}

czy robię coś źle? Ponieważ wyświetla błąd: Uncaught ArgumentCountError: Too few arguments to function - tak, jakby nie podstawiało tej wartości przekazanej w konstruktorze.

Dziękuję za pomoc.

komentarz 31 lipca 2018 przez Arkadiusz Waluk Ekspert (287,950 p.)
Źle, bo on sam się nie domyśli że argument $parametr w metodzie to akurat ta właściwość. Wtedy już nie przekazujesz do metody argumentu, tylko w metodzie dostaniesz się do tego przez $this->parametr.

A jeśli chodzi o samo podejście do tego to jak mówiłem, zależy co robisz. Jeśli masz tylko jedną klasę (nie ma np. wielu typów, różnych operacji w zależności od tego co zostało przekazane, czy czegoś, co mogłoby być rozszerzane) to zrobiłbym jedną klasę i do niej przekazał odpowiednie dane z zewnątrz. Jeśli to jest zwykły string czy coś to po prostu można go przekazać bez kombinowania z takimi rzeczami, nie wiem co ma Ci to zaoszczędzić. Jeśli przekazujesz do tego obiekt to wtedy możesz zrobić interfejs albo klasę abstrakcyjną, ale dla tego obiektu. Wszystkie jego implementacje będą wtedy mogły być przekazane podając jako argument klasę bazową.
komentarz 31 lipca 2018 przez Adam Ostrogórski Obywatel (1,070 p.)
Dziękuję za pomoc i wyjaśnienie.

Podobne pytania

0 głosów
2 odpowiedzi 340 wizyt
pytanie zadane 12 czerwca 2017 w C i C++ przez Akiro Bywalec (2,910 p.)
+1 głos
1 odpowiedź 165 wizyt
0 głosów
1 odpowiedź 122 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...