So che è possibile creare costanti globali in termini di loro utilizzando la concatenazione di stringhe:Posso utilizzare la concatenazione di stringhe per definire una classe CONST in PHP?
define('FOO', 'foo');
define('BAR', FOO.'bar');
echo BAR;
stamperà 'foobar'.
Tuttavia, sto ricevendo un errore nel tentativo di fare lo stesso utilizzando le costanti di classe.
class foobar {
const foo = 'foo';
const foo2 = self::foo;
const bar = self::foo.'bar';
}
foo2 è definito senza alcun problema, ma dichiarando bar const sarà errore fuori
Parse error: syntax error, unexpected '.', expecting ',' or ';'
Ho anche provato ad utilizzare funzioni come sprintf(), ma non gli piace la parentesi di sinistra più di quanto il concatenatore di stringhe '.'.
Quindi c'è un modo per creare costanti di classe in termini l'una dell'altra in qualcosa di più di un caso insignificante come foo2?
Non capisco la logica di diverso comportamento setter tra costanti globali e costanti di classe. Penso che visiterò presto bugs.php.net :) Ma per il breve termine, probabilmente sposterò le costanti fuori dalla classe e poi le copierò nella classe. Così fantastico! – selfsimilar
bug.php.net fondamentalmente mi ha detto che non l'avrebbero risolto. "Questa è una limitazione nell'implementazione Per la costante di classe abbiamo bisogno di un valore costante in fase di compilazione e non possiamo valutare espressioni. Define() è una funzione regolare, valutata in fase di esecuzione e può quindi contenere qualsiasi valore di qualsiasi forma cambiando questo vorrebbe dire aggiungere una fase di esecuzione nel compilatore ... " Che è in realtà BS, come funziona il seguente codice: define ('BAR', ThisWorks :: foo. 'Bar'); class ThisWorks { const foo = 'foo'; const bar = BAR; } echo ThisWorks :: bar; emetterà 'foobar' senza errori. – selfsimilar
Per chiunque altro lo cerchi, il bug è [# 42355] (https://bugs.php.net/bug.php?id=42355). –