2010-05-07 8 views
43

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?

risposta

15

secondo me, questa domanda merita una risposta per PHP 5.6+, grazie alla @jammin comment

partire da PHP 5.6 si è permesso di definire una statici espressioni scalari per una costante:

Sebbene non faccia parte della domanda, bisogna essere consapevoli dei limiti dell'implementazione.Quanto segue non funziona, anche se è contenuto statico (ma potrebbe essere manipolato in fase di esecuzione):

class Foo { 
    public static $bar = "baz"; 
    const HAZ = self::$bar . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) 

class Foo { 
    public static function bar() { return "baz";} 
    const HAZ = self::bar() . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' 

Per maggiori informazioni date un'occhiata a: https://wiki.php.net/rfc/const_scalar_exprs e http://php.net/manual/en/language.oop5.constants.php

0

no.

(non credo che ci sia)

14

cadono sempre di nuovo al manuale fidato per cose come questa.

Per quanto riguarda constants:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

Quindi ... "no" sarebbe la risposta: D

2

Per classe costanti, non è possibile assegnare qualcosa di diverso da un'espressione costante. Citando il PHP manual:

"Il valore deve essere un'espressione costante, non (per esempio) una variabile, una proprietà, a seguito di un'operazione matematica, o una chiamata di funzione"

34

L'unico modo è quello define() espressione e quindi utilizzare tale costante nella classe

define('foobar', 'foo' . 'bar'); 

class Foo 
{ 
    const blah = foobar; 
} 

echo Foo::blah; 

Un'altra opzione è quella di andare a bugs.php.net e gentilmente chiedere loro di risolvere questo problema.

+0

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

+8

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

+2

Per chiunque altro lo cerchi, il bug è [# 42355] (https://bugs.php.net/bug.php?id=42355). –

1

Questo può non essere direttamente quello che stai cercando, ma mi sono imbattuto in questa discussione, ecco una soluzione che ho usato per un problema che stavo avendo (in base al largo di @ di user187291 risposta):

define('app_path', __DIR__ . '/../../'); 
const APPLICATION_PATH = app_path; 
. 
. 
. 
require_once(APPLICATION_PATH . "some_directory/some_file.php"); 
. 
. 
. 

Sembra funzionare benissimo!

Problemi correlati