2010-05-07 9 views
43

wiem, że można tworzyć zmienne globalne pod względem siebie przy użyciu operacji konkatenacji:Czy mogę użyć konkatenacji ciągów do zdefiniowania klasy CONST w PHP?

define('FOO', 'foo'); 
define('BAR', FOO.'bar'); 
echo BAR; 

wypisze „foobar”.

Jednak otrzymuję komunikat o błędzie, próbując zrobić to samo, używając stałych klas.

class foobar { 
    const foo = 'foo'; 
    const foo2 = self::foo; 
    const bar = self::foo.'bar'; 
} 

foo2 jest określona bez problemu, ale deklarując const pasek error out

Parse error: syntax error, unexpected '.', expecting ',' or ';'

Ja również próbowałem przy użyciu funkcji takich jak sprintf(), ale nie lubi paren lewo dłużej niż ciąg konkatenator ".".

Czy istnieje sposób na stworzenie stałych klas w stosunku do siebie nawzajem w czymś więcej, niż w przypadku trywialnego zestawu znaków, takiego jak foo2?

Odpowiedz

15

IMHO, to pytanie zasługuje na odpowiedź na PHP 5.6+, dzięki @jammin comment

Od PHP 5.6 są dopuszczone do zdefiniowania statycznych wyrażeń skalarne na stałe:

Chociaż nie jest to częścią pytania, należy mieć świadomość ograniczeń wynikających z wdrożenia.Poniższa nie będzie działać, mimo że jest statyczny (ale może być manipulowany przy starcie):

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 ';' 

uzyskać dalsze informacje przyjrzeć: https://wiki.php.net/rfc/const_scalar_exprs i http://php.net/manual/en/language.oop5.constants.php

0

nie.

(I nie sądzę, że istnieje)

14

Zawsze spaść z powrotem do zaufanych instrukcji dla rzeczy jak ta.

chodzi 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.

Więc ... "nie" byłaby odpowiedź: D

2

Dla klasy stałych, nie można niczego innego niż stałej ekspresji przypisać. Cytowanie PHP manual:

„Ta wartość musi być stałym wyrażeniem, nie (na przykład) zmienną nieruchomości, w wyniku działania matematycznego lub wywołania funkcji”

34

Jedynym sposobem jest define() wyrażenia, a następnie użyć które stały w klasie

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

class Foo 
{ 
    const blah = foobar; 
} 

echo Foo::blah; 

Inną opcją jest, aby przejść do bugs.php.net i uprzejmie poprosić ich, aby rozwiązać ten problem.

+0

Nie rozumiem uzasadnienie różne zachowania ustawiającego między stałymi globalnymi a stałymi klasowymi. Myślę, że niedługo odwiedzę stronę bugs.php.net :) Ale na krótką metę pewnie po prostu wyprowadzę stałe z klasy, a następnie skopiuję je do klasy. Więc kludgy! – selfsimilar

+8

bug.php.net zasadniczo powiedział mi, że nie naprawią tego. "Jest to ograniczenie w implementacji, ponieważ dla stałej klasy potrzebujemy stałej wartości w czasie kompilacji i nie możemy oceniać wyrażeń define() jest funkcją regularną, ocenianą w czasie wykonywania i dlatego może zawierać dowolną wartość dowolnej postaci Zmiana ta oznaczałaby dodanie fazy kompilacji ... " Co właściwie jest BS, jak działa poniższy kod: define ('BAR', ThisWorks :: foo. 'Bar'); klasa ThisWorks { const foo = 'foo'; const bar = BAR; } echo ThisWorks :: bar; spowoduje wyświetlenie "foobar" bez błędu. – selfsimilar

+2

Dla każdego, kto tego szuka, błąd jest [# 42355] (https://bugs.php.net/bug.php?id=42355). –

1

To może nie być bezpośrednio co szukasz, ale natknąłem się na tego wątku, więc tutaj jest rozwiązanie, które użyłem do problemu miałem (oparte off użytkownika @ user187291 odpowiedź):

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

Wydaje się działać świetnie!

Powiązane problemy