name, id, description?
Ik zoek een kort woord voor de naam van een constant, die de lading dekt. Ik leg het even uit.
We hebben bijv. een lijstje met constanten die een waarde vertegenwoordigen:
Nu wil ik dus weten hoe je zo'n naam van een constante noemt, dus in dit geval "dutch" of "english". Ik wil namelijk een functie maken die die naam teruggeeft. Dus getXXX('nl') moet "dutch" teruggeven. Ik weet alleen geen goede functienaam. Ik dacht aan getName, maar het is eigenlijk niet echt een naam.
In code wil ik zeg maar zoiets kunnen doen:
Code (php)
Wie weet een leuk naam voor deze functie? Of misschien zoiets als valueToText(), alleen "text" is ook weer zo algemeen.
Code (php)
Het zou op zich kunnen, maar misschien is er hier iemand die nog iets beters weet?
pointername
Dus:
En dan wil je de naam van de constante achterhalen?
Correct. Die naam kan ik wel achterhalen... maar ik wil een goede naam hebben die uitlegt wat ik doe. Ik wil dus weten hoe je "dutch" noemt. Ik zou natuurlijk kunnen zeggen getConstantName ofzo, maar ik zoek iets korters. Je zet dus eigenlijk de value om naar xxx. Maar hoe noem je dat xxx? Het is geen ID, het is geen afkorting, ja het is text, maar dat is wel weer erg algemeen. Dus ik vroeg me af of iemand er een woord voor weet wat de lading dekt.
Het klinkt alsof je de key van een map/array wilt returnen. getKey() zou dan een goede naam zijn.
Kijk, ik wil bijvoorbeeld kunnen zeggen: echo 'Dos is wearing a ' . xxxx(3) . ' hat.';
En die xxx moet dan de functienaam zijn.
echo 'Dos is wearing a ' . getKey(3) . ' hat.';
Dit vind ik een te technische benadering. Logischer (voor mij) zou bijvoorbeeld zoiets zijn:
echo 'Dos is wearing a ' . getDescription(3) . ' hat.';
Alleen description is ook weer niet helemaal juist. Want de kleur "green" is niet echt een beschrijving. Maar wat is het dan wel? Een key of ID vind ik ook niet geschikt. En een afkorting is het ook niet. Het is een woordje dat staat voor een bepaalde value, maar hoe noem je zo'n woordje?
Als jij een constante hebt, wat voor zin heeft het dan om de naam daarvan te achterhalen?
Die weet je immers al want daarvoor is het een constante.
Gewijzigd op 02/05/2014 21:36:49 door Ger van Steenderen
Stel ik sla jou als persoon op in mijn database. Dan zeg ik Ger is een man (1) en heeft bruin (5) haar. Ik verzin maar even wat.
In de database staat dan bij Ger, gender:1 en hair_color:5
Nu wil ik bijv. een keer een overzicht van mijn users tonen. Dan is het handig als ik aan de hand van die 1 en 5 de benamingen weer kan oproepen, zodat ik zie dat Ger een man met bruin haar is. Daar wil ik dan bijv. die functie voor gebruiken.
getKey('green')
getHairColour($hair_colour_from_database) of HairColour::from($hair_colour_from_database)
Hoe jij het beschrijft is veel te magisch als je het mij vraagt.
Code (php)
1
2
3
4
2
3
4
<?php
$user = 'Reshad';
$user->setFavoriteColor(color::green); // hier wordt een constante gebruikt
?>
$user = 'Reshad';
$user->setFavoriteColor(color::green); // hier wordt een constante gebruikt
?>
Nu haal ik jouw gegevens uit de database en dan staat er bij favorite_color bijv. een 5. En dan wil ik die 5 weer kunnen terugbrengen naar 'green'.
Bijv. echo 'Reshad\'s favorite color is ' . getKey(5);
@Dos:
Ik snap wat je bedoelt, maar ik wil een functie waarmee je de betekenis dus weer teruggeeft aan een value. Je zult ergens die vertaalslag weer moeten maken.
Ik had gedacht dat er misschien een standaard-woord voor was, maar blijkbaar dus niet. Ik ga nog even verder over denken... thanks.
Maar dat is ook geen constante, want morgen ga ik naar de kapper.
Maar ik zie echt niet hoe je daar functies omheen moet gaan bouwen, volgens mij ben je een beetje aan het reverse engineeren
Gewijzigd op 02/05/2014 22:16:14 door Ger van Steenderen
Hehe :)
Hoe stel jij dan voor dat ik het moet aanpakken? Laten we even het voorbeeld van gender nemen. Om het geslacht in te stellen zijn ISO waardes opgesteld. Als ik me niet vergis: 0->onbekend, 1->man, 2->vrouw, 9->niet van toepassing. Op dit moment weet ik die waardes nog, maar over een maand niet meer. Daarom wil ik dus constanten gebruiken. Als iemand een man is, dan wil ik in mijn code dit kunnen doen:
$user->setGender(gender::male);
Dat is natuurlijk hartstikke handig en duidelijker dan $user->setGender(1);
Maar die 1 wordt wel opgeslagen. Als ik vervolgens die 1 weer ophaal uit de database, dan wil ik daar weer "male" van kunnen maken. Dat is toch juist handig lijkt me?
gender is zeker een interface na dat andere topic van je? Dan heb je alleen maar constanten tot je beschikking.
Als je er nou op deze manier een class van maakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
final class Gender {
const UNKNOWN = 0;
const MALE = 1;
const FEMALE = 2;
const NOT_APPLICABLE = 9;
public static function from($value) {
static $names = ['UNKNOWN', 'MALE', 'FEMALE', 'NOT_APPLICABLE'];
foreach ($names as $name) {
if (constant(__CLASS__ . '::' . $name) === $value) {
return $name;
}
}
throw new InvalidArgumentException('No matching gender for value ' . $value);
}
// no instances allowed
private function __construct() {}
}
?>
final class Gender {
const UNKNOWN = 0;
const MALE = 1;
const FEMALE = 2;
const NOT_APPLICABLE = 9;
public static function from($value) {
static $names = ['UNKNOWN', 'MALE', 'FEMALE', 'NOT_APPLICABLE'];
foreach ($names as $name) {
if (constant(__CLASS__ . '::' . $name) === $value) {
return $name;
}
}
throw new InvalidArgumentException('No matching gender for value ' . $value);
}
// no instances allowed
private function __construct() {}
}
?>
"Dat is toch juist handig lijkt me?"
Ja, maar de manier waarop je het werkend wilt hebben is veel te magisch.
Gewijzigd op 02/05/2014 23:15:13 door Dos Moonen
Vraag 1: hoe gebruik je dit dan? Zo?
echo 'Dos is een ' . gender::from(1);
Dat zou inderdaad ook kunnen en is niet eens zo verkeerd. Dit is inderdaad een optie.
Je hebt gelijk dat 1 de ene keer bij 'male' hoort en de andere keer bij 'wit'. Dus daarom dacht ik dus aan een getDescription method. Dus op deze manier. Wat vind jij hiervan?
echo 'Dos is een ' . gender::getDescription(1);
Wat vind je dan beter? getDescription() of from()? Voor jouw idee valt in ieder geval zeker ook iets te zeggen.
Wat beftreft jouw code... (en nu moet ik oppassen als onopgeleid programmeur... gniffel gniffel)
Wat ik er persoonlijk niet prettig aan vind, is dat je de constanten ook in de from method benoemt. Op 2 plekken dus. Dat betekent dat als je ooit een constante toevoegt, wijzigt of verwijdert, je dit op 2 plekken moet doen.
Mijn idee is dan om een abstract class te maken met als child de Gender class. In die abstracte class zet ik dan die from() of getDescription() method. Via een reflection class haal ik een array met de constanten op. Die array draai ik om, zodat de keys de values worden. Die array sla ik vervolgens op in de abstracte class zodat deze slechts eenmaal gegenereerd hoeft te worden. En aan de hand van de value die binnenkomt, geef ik dan de naam van de constant terug. Op deze manier kan ik die abstracte class hergebruiken, en hoef ik in de child classes alleen nog maar de constants toe te voegen. Goed idee?
http://www.phphulp.nl/php/forum/topic/oop-hoe-consante-terugkrijgen/94745/#679963
Ik wordt gek...
We beginnen met een vraag over een naam, van 2 dingen die totaal niks met elkaar te maken hebben, namelijk landennamen en kleuren. Vervolgens gaat de vraag niet meer over deze dingen, maar over geslachten. Een half uurtje daarna gaat het ook niet meer over de naam en binnen 5 uur zijn we weer terug op de vraag in je vorige topic...
Ik wordt gek...
We beginnen met een vraag over een naam, van 2 dingen die totaal niks met elkaar te maken hebben, namelijk landennamen en kleuren. Vervolgens gaat de vraag niet meer over deze dingen, maar over geslachten. Een half uurtje daarna gaat het ook niet meer over de naam en binnen 5 uur zijn we weer terug op de vraag in je vorige topic...
Goede suggesties zijn welkom.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
public static function from($value) {
static $names;
if ( ! $names) {
$class = new ReflectionClass(self::class);
$constants = $class->getConstants();
$names = array_keys($constants);
}
foreach ($names as $name) {
if (constant(__CLASS__ . '::' . $name) === $value) {
return $name;
}
}
throw new InvalidArgumentException('No matching gender for value ' . $value);
}
?>
public static function from($value) {
static $names;
if ( ! $names) {
$class = new ReflectionClass(self::class);
$constants = $class->getConstants();
$names = array_keys($constants);
}
foreach ($names as $name) {
if (constant(__CLASS__ . '::' . $name) === $value) {
return $name;
}
}
throw new InvalidArgumentException('No matching gender for value ' . $value);
}
?>
Tada, nu werkt het met reflection.
Had PHP maar first class enums...
Edit: oh, en wat die twee namen betreft moet je zelf maar kiezen, dat doe je uiteindelijk toch wel.
Gewijzigd op 03/05/2014 09:30:18 door Dos Moonen
Wat doe jij nu eigenlijk op de 4e regel als ik vragen mag?
static $names?
Ik wil trouwens geen foreach loop gebruiken maar een class property (als dat lukt) met als keys de values en als values de namen van de constants. Dan kan ik kijken of de value is set, en dan meteen de naam van de constant teruggeven. Dan ben ik die foreach loop kwijt namelijk.
PHP heeft ook statische variabele binnen functies, het zelfde idee als statische variabele binnen classes alleen minder flexibel omdat het alleen binnen die functie te gebruiken is.
http://3v4l.org/13gHJ
"Ik wil trouwens geen foreach loop gebruiken maar een class property (als dat lukt) met als keys de values en als values de namen van de constants. Dan kan ik kijken of de value is set, en dan meteen de naam van de constant teruggeven. Dan ben ik die foreach loop kwijt namelijk."
Prima, sla array_flip($constants) op in de statische variabele en je kunt isset() gebruiken. Het was alleen als voorbeeld/inspiratie bedoeld.
Ik moest even 3x kijken wat je nu bedoelde, maar ik snap 'm nu. Wat grappig :) Wist ik niet eens.
>> Prima, sla array_flip($constants) op in de statische variabele en je kunt isset() gebruiken. Het was alleen als voorbeeld/inspiratie bedoeld.
Yes, top! Dankjewel voor het meedenken Dos!