Gehe ich richtig davon aus, dass const-Eigenschaften automatisch öffentlich sind? Gibt es eine Möglichkeit, sie privat oder geschützt zu machen?
Danke im Voraus.
Gehe ich richtig davon aus, dass const-Eigenschaften automatisch öffentlich sind? Gibt es eine Möglichkeit, sie privat oder geschützt zu machen?
Danke im Voraus.
BoltClock
In der Vergangenheit waren Klassenkonstanten immer öffentlich zugänglich, solange die Klasse geladen war und es keine Möglichkeit gab, dies zu ändern.
Ab PHP 7.1 bleiben sie aber standardmäßig öffentlich Zugriffsmodifikatoren können jetzt angewendet werden. Hier ist das Beispiel aus den Versionshinweisen:
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Scott
Klassenkonstanten sollten die Möglichkeit haben, privat/geschützt zu sein, da sie interne Details der Klasse offenlegen, die andere Klassen/Code fälschlicherweise verwenden können, weil sie glauben, dass sie in Ordnung sind, weil sie öffentlich sind.
Es wäre schön zu wissen, dass das Ändern einer privaten Konstante NUR die Klasse betrifft, in der sie definiert ist. Leider haben wir diese Option nicht.
Erinnern Sie sich an die Zeit, als Sie Objektdesign und -analyse gelernt haben … Sie geben Klassenmethoden und -attributen den möglichst restriktiven Zugriff und lockern sie später nach Bedarf (viel schwieriger, in die andere Richtung zurückzukehren, da andere Klassen / Code beginnen, sie zu verwenden). würde dann anderen Code brechen).
ABHILFE
Am besten erstellen Sie einfach eine private oder geschützte Variable und schreiben sie in Großbuchstaben, um zu zeigen, dass es sich um eine Konstante handelt. Sie könnten immer eine Klasse namens constant($value_to_be_constant) erstellen, die die richtigen magischen Methoden / spl-Schnittstellen implementiert, um zu verhindern, dass sie geändert werden.
Mrok
Mir ist bewusst, dass diese Frage 6 Jahre alt ist
Php 7.1 (derzeit RC1) ermöglicht es, die Sichtbarkeit von Klassenkonstanten anzugeben.
class Token {
// Constants default to public
const PUBLIC_CONST = 0;
// Constants then also can have a defined visibility
private const PRIVATE_CONST = 0;
protected const PROTECTED_CONST = 0;
public const PUBLIC_CONST_TWO = 0;
//Constants can only have one visibility declaration list
private const FOO = 1, BAR = 2;
}
Ab php7.1mit können Sie Ihre Klassenkonstanten definieren Zugriffsmodifikatoren (public
, private
oder protected
). Sehen Sie sich das folgende Beispiel an:
<?php
class superheroes{
public const kal_el="Superman";
protected const bruce_wayne="Batman"; # works php7.1 onwards
private const anthony_stark = 'Iron Man'; # works php7.1 onwards
public static function show_remaining(){
echo self::bruce_wayne, '<br />';
echo self::anthony_stark, '<br />';
}
}
echo superheroes::kal_el, '<br />';
superheroes::show_remaining();
Kredite: http://dwellupper.io/post/48/defining-class-constants-in-php
Was ist der Grund, sie zu verstecken? Obwohl sie öffentlich sind, werden sie nur gelesen.
– zerkms
22. Dezember 2010 um 0:21 Uhr
Konstanten sollen öffentlich sein, weil sie unveränderliche Tatsachen über die Klasse beschreiben sollen, nicht den Staat oder ihn. Es macht also keinen Sinn, sie zu verstecken.
– StasM
22. Dezember 2010 um 0:50 Uhr
Könnte sie in zukünftigen Versionen mit fälschen
__getStatic
. Generell ist es fraglich, ob man in Skriptsprachen überhaupt Zugriffsmodifikatoren benötigt. (Javascript/Python sind viel objektorientierter und brauchen sie nicht.)– mario
22. Dezember 2010 um 2:14 Uhr
Ich denke nicht, dass es eine dumme Frage ist; Private Klassenkonstanten wären nützlich: Für den internen Gebrauch in der Klasse … könnten öffentliche Methoden sie verwenden, aber externer Code sollte nicht von ihnen abhängen … die API könnte sich ändern.
– Hundewetter
2. Oktober 2011 um 22:11 Uhr
Nun, zum einen, wenn Sie eine Datenbankklasse erstellen möchten, wäre es sinnvoll, den Host, den Benutzernamen, den Server und die Datenbank als private Konstanten zu deklarieren, oder?
– Benutzer1020069
25. Juni 2012 um 21:17 Uhr