[php/OO] constants overriden toegestaan; normaal of fout?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ik ben in php bezig met wat OOP, en nou viel mij op dat php het toe laat om class constant te overriden (dmv een nieuwe declaratie) in een afgeleide class. ikzelf vind dit vreemd omdat een constante constant dient te zijn, ook in afgeleide classes (imho). ik vroeg mij dus ook af, of het overriden van class constants een normale feature is van het OO programmeren of dat het gewoon een fout is binnen php.

NB.
als je in php een member variabele opnieuw wilt declareren krijg je wel netjes een fatal error.

vb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class baseclass {

  const BLAAT = 'ja';
  
  public $schaap = 5;
  
}

class subclass extends baseclass {
  
  const BLAAT = 'nee'; //dit wordt dus toegestaan

  public $schaap = 1; //dit levert netjes een error op

}

$test = new subclass;

echo subclass::BLAAT; //geeft 'nee' 

[ Voor 1% gewijzigd door tombo_inc op 26-11-2006 01:01 . Reden: foutje in het voorbeeld ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • gibraltar
  • Registratie: Augustus 2004
  • Laatst online: 20-09 21:44
Op http://www.zend.com/php5/articles/engine2-php5-changes.php staat dat elke class eigen constantes heeft, wat dus inhoud dat een derived class ook eigen constantes kan hebben, terwijl zijn parent een constant heeft met dezelfde naam.
Kortom, het is geen bug, tis een feature?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb geen verstand van PHP, maar volgens mij rammelt je code aan alle kanten.
subclass is geen afgeleide van baseclass (of PHP moet een automagisch systeem hebben dat wanneer een class met 'sub' begint gezocht wordt naar een class die met 'base' begint om 'm van af te leiden), je creeert een instance $test, maar vraagt vervolgens BLAAT van de class zelf op, en niet van de instance?

Wat ik van PHP 5 begrijp is dat 't heel erg z'n best doet om OO te implementeren, maar 't helpt ook als de ontwikkelaar ook OO probeert te denken...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je override geen constante, je creeert een andere constante met dezelfde naam in een andere namespace. Ik vind het eerder vaag dat hij bij $schaap een error geeft.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ok bedankt voor de reacties.
het is dus geen fout maar gewoon normaal gedrag, dat wou ik even weten.

bij het feit dat php bij het $schaap geval een fout geeft heb ik een tweeledig gevoel. je mag namelijk wel het acceslevel aanpassen van een property (alleen zwakker), maar je mag niet de (initiele) waarde van de property aanpassen. dat is natuurlijk een beetje vaag.
aan de andere kant heeft deze "feature" (zo noem ik het maar even) ook wel wat. je kunt namelijk de property bij de (eerste) declaratie een initiele waarde opgeven, zodat je geen undefined properties hebt. vervolgens mag je in de declaratie wel het accesslevel aanpassen (in afgeleide klassen) maar niet de waarde. dit vind ik persoonlijk wel netter, omdat je hiermee een betere scheiding aanbrengt tussen interface en implementatie (niet dat php een duidelijk/danwel geen verschil kent tussen interface en implementatie bij het definieren van klassen, maar het gaat om het idee). je wordt zo gedwongen om de constructor te gebruiken om waardes te setten. aan de andere kant, php is al zo loose typed, dus waarom wel hierover moeilijk doen. daarnaast is het niet echt consistent om in het eerste geval wel toe te staan dat er in de property declaratie waardes toegekend mogen worden, en het vervolgens te verbieden.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Waarschijnlijk helpt het als je abstract voor je class baseclass zet.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!

Pagina: 1