Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Nochmal const mit concatenate

0 views
Skip to first unread message

Karsten Wutzke

unread,
Dec 11, 2009, 2:51:31 PM12/11/09
to
Hallo alle,

ich habe das schon einmal gefragt, aber mich regt es auf, dass
Folgendes nicht geht:

class Dirs
{
// directory (paths)
const BASE = BASE_PATH;

const CACHE = self::BASE . '/' . DirNames::CACHE;
}

Ein concat bei const geht einfach nicht. Warum weiß nur der Teufel.
Für defines() gilt die Regel nicht, und obiges in Java funktioniert
auch einwandfrei ohne kaputtzugehen. Wo ist das Problem für PHP hier
einfach den Wert der zur Laufzeit entsteht zu finalisieren und gut?
Mehr will ich doch gar nicht. Ist doch kein Wunder, dass schlechte
nicht-OO Programmiergewohnheiten bleiben ( defines() ), wenn PHP nicht
mal sowas hinbekommt, oder wie seht ihr das? Ansonsten bleibt nur
public static, aber das ist ja einfach nur grottenschlecht, da non-
final.

Was sind denn nun die technischen Schwierigkeiten mit denen da PHP zu
kämpfen hat? Ich raffs nicht.

Karsten

Johannes Mueller

unread,
Dec 11, 2009, 5:04:31 PM12/11/09
to
Karsten Wutzke wrote:

> ich habe das schon einmal gefragt, aber mich regt es auf, dass
> Folgendes nicht geht:
>
> class Dirs
> {
> // directory (paths)
> const BASE = BASE_PATH;
>
> const CACHE = self::BASE . '/' . DirNames::CACHE;
> }

Das geht auch nicht mit nicht-Konstanten.

z.B. geht

class Foo{
public $foo = 'bar' . 'baz';
}

ebenfalls nicht. Aber Du kannst Dir nat�rlich eine passende Getter-Methode
definieren, in der Du dann nat�rlich auch Konstanten concatten kannst.

Gr��e
Johannes

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gel�scht.

Karsten Wutzke

unread,
Dec 15, 2009, 1:45:41 PM12/15/09
to
On 11 Dez., 23:04, "Johannes Mueller" <johanne...@gmx.net> wrote:
> Karsten Wutzke wrote:
> > ich habe das schon einmal gefragt, aber mich regt es auf, dass
> > Folgendes nicht geht:
>
> > class Dirs
> > {
> > // directory (paths)
> > const BASE = BASE_PATH;
>
> > const CACHE   = self::BASE . '/' . DirNames::CACHE;
> > }
>
> Das geht auch nicht mit nicht-Konstanten.
>
> z.B. geht
>
> class Foo{
>     public $foo = 'bar' . 'baz';
>
> }
>

Hatt ich nicht versucht. Wird ja immer schlimmer. :-/ Ich glaube PHP
wird doch nur Nebengleis für mich. Da fehlen mir echt noch zuviele
Basics.

Karsten

Johannes Mueller

unread,
Dec 15, 2009, 2:56:52 PM12/15/09
to
Karsten Wutzke wrote:

>>> class Dirs
>>> {
>>> // directory (paths)
>>> const BASE = BASE_PATH;
>>
>>> const CACHE = self::BASE . '/' . DirNames::CACHE;
>>> }
>>
>> Das geht auch nicht mit nicht-Konstanten.
>>
>> z.B. geht
>>
>> class Foo{
>> public $foo = 'bar' . 'baz';
>>
>> }
>>
>
> Hatt ich nicht versucht. Wird ja immer schlimmer. :-/ Ich glaube PHP

> wird doch nur Nebengleis f�r mich. Da fehlen mir echt noch zuviele
> Basics.

Steht so z.B. auch im Manual:
http://www.php.net/manual/en/language.oop5.properties.php

"This declaration may include an initialization, but this initialization
must be a constant value--that is, it must be able to be evaluated at
compile time and must not depend on run-time information in order to be
evaluated."

Example #1 zeigt ein paar Beispiele dazu.

Ulf [Kado] Kadner

unread,
Dec 16, 2009, 2:43:01 PM12/16/09
to
Hallo Karsten Wutzke! Du schriebst:

> Hatt ich nicht versucht. Wird ja immer schlimmer. :-/ Ich glaube PHP
> wird doch nur Nebengleis für mich.

Das kannst Du natürlich tun wie Du willst.

> Da fehlen mir echt noch zuviele Basics.

Dann lern sie doch. Jaja ich weis schon was Du sagen willst :-)

Folgende Frage stellt sich mir bei Deiner Äußerung:

- Welche Quelle in der Informatik definiert das was Du "Basics" nennst
in der von Dir gewönschten Form?

Ich würde hier ja eher darauf tippen das Du dieses Verhalten von einer
anderen Sprache so kennst und nur erwartest das PHP das genau so handhabt.

MfG, Ulf

--
Ein Leben ohne Mops ist möglich, aber sinnlos!
[Loriot]

Karsten Wutzke

unread,
Dec 18, 2009, 11:59:37 AM12/18/09
to
On 16 Dez., 20:43, "Ulf [Kado] Kadner" <dr_lo...@gmx.net> wrote:
> Hallo Karsten Wutzke! Du schriebst:
>
> > Hatt ich nicht versucht. Wird ja immer schlimmer. :-/ Ich glaube PHP
> > wird doch nur Nebengleis für mich.
>
> Das kannst Du natürlich tun wie Du willst.
>
> > Da fehlen mir echt noch zuviele Basics.
>
> Dann lern sie doch. Jaja ich weis schon was Du sagen willst :-)
>
> Folgende Frage stellt sich mir bei Deiner Äußerung:
>
> - Welche Quelle in der Informatik definiert das was Du "Basics" nennst
>   in der von Dir gewönschten Form?
>
> Ich würde hier ja eher darauf tippen das Du dieses Verhalten von einer
> anderen Sprache so kennst und nur erwartest das PHP das genau so handhabt.
>

Genau das. PHP Basics. Ich wollte eigentlich als Workaround defines
"concatten", dann diese als const's in eine Klasse packen und danach
die defines wieder undefinen... aber grad gelesen, dass man defines
gar nicht undefinen kann. Das meine ich mit Basics. Ich frage mich
gerade wie man so vernünftig PHP const's verwenden will... bzw. warum
sollte man, wenn dieselben defines eh existieren. Das würde man nur
aus "good practice" heraus tun. Schlimm grad.

Karsten

Michael Fesser

unread,
Dec 18, 2009, 4:34:57 PM12/18/09
to
.oO(Karsten Wutzke)

>Genau das. PHP Basics. Ich wollte eigentlich als Workaround defines
>"concatten", dann diese als const's in eine Klasse packen und danach
>die defines wieder undefinen... aber grad gelesen, dass man defines
>gar nicht undefinen kann.

W�re auch Unsinn.

>Das meine ich mit Basics. Ich frage mich

>gerade wie man so vern�nftig PHP const's verwenden will... bzw. warum
>sollte man, wenn dieselben defines eh existieren. Das w�rde man nur


>aus "good practice" heraus tun. Schlimm grad.

define() ist f�r Konstanten im globalen Namensraum, const f�r Konstanten
im Kontext einer Klasse. Da� hierf�r auch tats�chlich nur konstante
Werte zul�ssig sind, ist zwar einerseits eine Beschr�nkung, andererseits
aber auch durchaus logisch. In vielen anderen Sprachen gibt es �hnliche
Beschr�nkungen. Da diese Ausdr�cke �blicherweise bereits zur Compilezeit
ausgewertet werden, h�ngt es i.d.R. einfach vom Compiler ab, was m�glich
ist und was nicht. Da� manche Sprachen hier weniger erlauben als andere,
ist nicht als Fehler zu werten.

W�rde es Dir helfen, statische Eigenschaften zu deklarieren und diese
zum Zeitpunkt des _Ladens_ der Klassendefinition zu initialisieren? Also
sprich: einen Klassenkonstruktor zu simulieren? Das geht mittels Auto-
load und Reflection, siehe Msg-ID <1514197.c...@malkusch.de> ff.

Micha

0 new messages