Ola,

Ik heb een class met daarin een paar constant values. Verder doet die class niks, en daarom wil ik voorkomen dat de class geinstantieerd kan worden.

Volgens mij zijn daar 2 manieren voor:
- de class abstract maken, óf...
- een private constructor in de class zetten

Heeft een van deze methodes een voorkeur? Maakt het iets uit? Of is er nog een andere manier?
"Ik kan toch niet automatisch een namespace laden?"
Tot PHP 5.6 kun je alleen classes/interfaces/traits importeren met het use keyword. https://wiki.php.net/rfc/use_function Heeft dat voor PHP 5.6 veranderd: je kunt functies en constanten ook importeren met het use keyword.

Is dat waar je het over had?
Dos, ik denk het niet.

Even een voorbeeldje om het idee duidelijk te krijgen. Ik wil ergens een language instellen aan de hand van constanten die in een language class staan. Dus zeg maar zoiets als dit:

<?php

namespace language;

class language {

const NL = 0;
const DE = 1;

}

?>
<?php

namespace user\preferences;

class preferences {

public function setLanguage($language) {

}

}

?>
En dan wil ik dit kunnen doen:

<?php

use user\preference\preferences;
use language\language;

$user_preferences = new preferences();
$user_preferences->setLanguage(language::NL);

?>
Die language class bevat alleen maar een aantal constanten, en daarom moet die class niet geinstantieerd kunnen worden.
<?php

namespace language;

const NL = 0;
const DE = 1;

?>

<?php

use user\preference\preferences;
use language;

$user_preferences = new preferences();
$user_preferences->setLanguage(language\NL);

?>

Tada!
Thanks Dos, tot zover volg ik je nog.. :)

Maar... ik ben ff kwijt hoe ik dit nu moet inladen :-s

Ik gebruik een autoloader om classes te loaden.

Hier wordt de language class dus automatisch geladen.

$user_preferences->setLanguage(language::NL);

Maar hoe doe ik dat dan in jouw situatie? Ik kan die namespace toch niet automatisch laden?
Constants in interfaces werken weldegelijk. Misschien eerst testen voordat je een perfect antwoord naar de prullenbak verwijst?
Wouter, ik wilde eigenlijk eerst aan je vragen waarom je zo raar reageert, omdat ik dacht dat je het over de oplossing van Dos had. Maar toen zag ik dat het over de oplossing van Ward ging.

Die heb ik gisteren getest en toen deed ie het niet. Net nog een keer getest en nu doet ie het wel. Ik vermoed dat ik dus gisteren ergens een echo ben vergeten.

Dus ondanks dat ik je opmerking in eerste instantie totaal niet begreep... toch bedankt :)
En Ward ook bedankt!
Graag gedaan, ik wilde al vragen waarom je zo reageerde ;-)
Hehe, sorry Ward...

Ik had het getest, maar ik denk echt dat ik de echo ben vergeten. Anyhow... gelukkig was Wouter nog daar om me even wakker te schudden.

Al met al een mooie en prima oplossing! :)

Reageren