Cytat
Zdecyduj się czy zmiana nazwy i kodowania mają być wstrzykiwane, czy dodawane jako dekoratory, bo wcześniej pisałeś, żeby je wstrzykiwać i ciekawe jak zdecydujesz w klasie Upload, którą metodę użyjesz ze wstrzykniętego obiektu, skoro masz tam 5 metod, co użyjesz wszystkich, czy jednej, a jak będziesz chciał użyć innej, to będziesz edytował klasę Upload? Jaki to ma sens?
Niczego nie miałbym edytować bo jako parametr ma interfejs a nie implementacje, wiec ta klasa ma dowolna definicje, zgodna jedynie z interfejsem po którym dziedziczy, ale dałem Ci potem przykład, ze równie dobrze te zależności mogą być dekoratorami bo zmieniają oryginalny obiekt.
Cytat
Ma znaczenie, bo musisz za każdym razem wrzucić do UploadImage coś co implementuje interfejs z kontruktora, a nie zawsze jest taka potrzeba.
Daj mi przypadek kiedy upload nie potrzebuje zapisać pliku, nie ma takiego.
Cytat
Klasa abstrakcyjna ma to do siebie, że oprócz metod abstrakcyjnych, które się w niej dodaje, nie daje możliwości stworzenia z niej bezpośrednio obiektu.
Dopiero z klasy dziedziczącej po klasie abstrakcyjnej, można stworzyć obiekt. Dlatego właśnie klasy abstrakcyjne w moim rozwiązaniu nie posiadają konstruktorów, a gotowe metody, które funkcjonują dopiero po odpowiednim zdefiniowaniu konstruktorów klas dziedziczących. Więc nie chodzi o to:
A kto mi zabroni zrobić konstruktor klasy abstrakcyjnej :
http://ideone.com/VcUReVCytat
żeby dopisać słówko abstract, tylko, żeby nie można było stworzyć z niej obiektu, bo bez konstruktora jest bezużyteczna. Mam nadzieję, że wyjaśniłem.
Wiem czemu to zastosowałeś, ale nie jest to dobre podejście. Każda klasa ma konstruktor nie ważne jakie słówko sobie przed nią postawisz. Bo jest coś takiego jak konstruktor domyślny, który nie musi być zdefiniowany jawnie i tu kłania się brak podstaw php

Dlatego tez tworząc singleton musisz
Cytat
The constructor __construct() is declared as protected to prevent creating a new instance outside of the class via the new operator.
Cytat
Na koniec chcę dodać, że ten kod jest łatwiejszy do zrozumienia, ale trudniejszy do rozbudowy, dodasz parę rzeczy i zrobi się bagno, po za tym jeżeli przekazujesz pomiędzy dekoratorami plik bezpośrednio z requesta, to nie możesz zmienić mu nazwy, ani przeedytować go w żaden sposób, więc nadal jest to uproszczone rozwiązanie czysto teoretyczne.
Poproszę choć jeden przykład, w którym miejscu
daro0 zły przykład bo oba są poprawne, bo klasa abstrakcyjna daje nam tylko informacje o tym, że potomek potrzebuje jeszcze metody execute i ma to sens, bo unikniemy pomyłek, ale nie jest to wymagane, ale masz rację lepiej jak obiekt o to dba. Tylko, ze jak ktoś napisze to tak jak w przypadku b, to pamiętając o tym, ze ta klasa ma mieć te metodę tez zadziała, tylko poco ma to pamiętać.
Cytat
Zwykła klasa też nie musi mieć metod i co to też jest debilne?
Nie, przykład wprost z jednego z moich projektów, nigdzie w definicji klasy nie masz powiedziane, ze ona ma mieć jakieś metody. Inaczej jest z klasa abstrakcyjna, która ma mieć co najmniej jedną metodę czysto wirtualna/abstrakcyjną.
class Services
{
const KERNEL_COMMAND_EXTENSION_REGISTRY = 'proton.common.command.extension_registry';
const KERNEL_COMMAND_HANDLER_MAP = 'proton.common.command.handler_map';
const KERNEL_SERVICE_LOCATOR = 'proton.common.service.locator';
const KERNEL_TRANSACTION_FACTORY = 'proton.common.transaction.factory';
}