Ist es möglich, eine lokale Konstante innerhalb einer PHP-Funktion zu definieren?
Lesezeit: 3 Minuten
Arth
Es könnte schön sein, eine lokale Konstante im Rahmen einer Funktion in PHP definieren zu können
Auf diese Weise würde jeder, der die Funktion liest, wissen, dass diese Definition innerhalb der Funktion endgültig ist und keinen externen Code beeinflusst
So etwas (nicht gültige Syntax):
public function laughManiacally($count){
const LAUGH = 'HA';
for($i=0;$i<$count;$i++){
echo LAUGH;
}
};
Oder möglicherweise (wieder nicht gültig):
...
final $laugh="HA";
...
Gibt es trotzdem, dies zu tun? Und wenn nicht, warum nicht?
AKTUALISIEREN
Die Art und Weise, wie JavaScript die Deklaration von Konstanten auf Blockebene ermöglicht, ähnelt der Funktionalität, nach der ich gesucht habe
function laughManiacally(count) {
const LAUGH = 'Ha';
for (let i = 0; i < count; i++) {
console.log(LAUGH);
}
}
Markus B
Du solltest haben
echo name_of_class::LAUGH
Andernfalls sucht PHP nach a global Konstante, die mit erstellt wurde define().
nachverfolgen:
Sie können Konstanten auch nur auf Objektebene definieren, z
class foo {
const BAR = 'baz'; // valid
function foo() {
const BAR = 'baz'; // invalid. can't define constants INSIDE a method.
}
}
gibt immer noch Fehler, vielleicht mache ich es falsch: –eval.in/654344 . korrigieren Sie mich
– Anant – Lebendig um zu sterben
3. Oktober 2016 um 15:31 Uhr
Cool, das habe ich erlebt, aber gibt es trotzdem eine lokale Variable als schreibgeschützt zu markieren?
– Arth
3. Oktober 2016 um 15:38 Uhr
es ist eine lokale Variable. Es kann nicht von “außerhalb” der Funktion darauf zugegriffen werden, also was bringt es, es schreibgeschützt zu machen? Wenn Sie möchten, dass es nur gelesen wird, schreiben Sie nicht darauf (außer zur Initialisierung).
– Markus B
3. Oktober 2016 um 15:41 Uhr
Aus dem gleichen Grund würde ich eine öffentliche Klassenvariable nicht als Klassenkonstante verwenden. Ich möchte mich und andere Teammitglieder daran hindern, darauf zu schreiben. Ich war auch neugierig.. Ich denke, das Kommentieren einer lokalen Variablen ist wahrscheinlich so nah, wie ich es bekommen werde!
– Arth
3. Oktober 2016 um 15:49 Uhr
ShiraNai7
Nein, es gibt keine Konstanten auf Funktionsebene in PHP. Das Nächstliegende ist a Klasse konstant:
class A
{
const LAUGH = 'HA';
function laughManiacally($count)
{
for ($i=0; $i < $count; ++$i) {
echo static::LAUGH;
}
}
}
$obj = new A();
$obj->laughManiacally(5);
Ausgabe:
HAHAHAHAHA
Ich habe es auch versucht final $laugh="HA";
Das final Das Schlüsselwort kann nicht auf Klasseneigenschaften angewendet werden, sondern nur auf Methoden.
Normalerweise finde ich, dass die Dokumentation keine Dinge spezifiziert, die nicht vorhanden sind.. und daher ist es nicht einfach, selten verwendete Konstrukte zu finden. Ich habe diese Syntaxversuche hauptsächlich verwendet, um die Art von Funktionalität zu demonstrieren, auf die ich gehofft hatte.
– Arth
3. Oktober 2016 um 15:45 Uhr
Macht
Ich glaube, Sie verwirren const mit Spielraum hier.
function foo() {
$x = 1;
}
Ich muss nicht deklarieren $x Als ein const weil es bereits auf nur beschränkt ist foo(). Ich müsste es explizit auf den globalen Geltungsbereich heben, um es anderswo zu verwenden (was aus vielen Gründen eine schlechte Idee ist). $x kann geändert werden, aber nur, wenn Sie dies innerhalb Ihrer Funktion tun oder den Code bearbeiten.
Ironischerweise werden Konstanten durch using festgelegt define sind global angelegt, mit const im Allgemeinen global, vorausgesetzt, Sie verwenden einen Autoloader
hmmm, könnte falsch sein, aber ich denke, sie wünschen sich eher die Aspekte “schreibgeschützt” und “einmal reserviert” von const. Dennoch ist dies eine wichtige Einsicht, da class const, global const und define alle effektiv globale Konstanten sind. Selbst wenn Sie also const im übergeordneten Geltungsbereich einer Funktion deklarieren müssen, gibt es in PHP praktisch keinen wirklichen Unterschied.
– Dieser Realty Programmer Guy
24. Juli um 4:02
10550800cookie-checkIst es möglich, eine lokale Konstante innerhalb einer PHP-Funktion zu definieren?yes