Nahradit všude self → static?
- Ondřej Mirtes
- Člen | 1536
Před nějakou dobou jsme ve firmě narazili na to, že Nette\Config\Config
v konstruktoru používal klíčové slovo self
namísto
static
. Což se ukázalo jako problém, protože když jsme si tuto
třídu podědili, tak tento konstruktor stále vytvářel podklíče jako
objekty nadtřídy a dělalo to bordel (některé konfigurační položky měly
vlastnosti naší poděděné třídy, některé ne). Vytvořil
jsem a poslal fix a David ho přijmul.
Problém vyřešen.
Jenže tento týden jsem narazil na stejný problém u třídy Nette\Image, kdy jsem si jí podědil, abych si dopsal některé vlastnosti (jmenovitě, aby si pamatovala cestu k souboru, ze kterého byl obrázek vytvořen a metodu getHtml() na vrácení HTML tagu obrázku). V praktických statických metodách fromFile, fromBlank apod. je opět užíváno klíčové slovo self a to způsobuje, že i v případě přístupu přes poděděnou třídu se vytvoří objekt typu Nette\Image. Situaci ještě zhoršuje třída Nette\ImageMagick a zatím netuším, jak bych čistě a pomocí co nejméně řádků kódu vyřešil vzájemnou spolupráci mezi Nette\Image, Nette\ImageMagick, Medio\Image a Medio\ImageMagick, aby se vše chovalo korektně.
Protože tuším, že tímhle problémem bude Nette prošpikované a nerad bych posílal postupně Davidovi náhrady self → static v místech, kde jsem to zrovna potřeboval, vznáším tedy návrh, aby verze frameworku pro PHP 5.3 obsahovala tam, kde se předpokládá využití dědičnosti, klíčové slovo static namísto self.
- Ondřej Mirtes
- Člen | 1536
Podle mě u PHP 5.2 toto chování nemůže očekávat nikdo (ten jazyk to zkrátka nepodporuje), u PHP 5.3 by mělo být výchozí a podle mě je přínosné.
- David Grudl
- Nette Core | 8227
Snažil jsem se to už všude, kde to dávalo smysl, nahradit. Ale na Image jsem asi zapomněl.