/ / ReflectionClass :: getDefaultProperties () i stałe klas - php, reflection, php-5.3

ReflectionClass :: getDefaultProperties () i stałe klasy - php, reflection, php-5.3

Używam Reflection w stosunku do następującej klasy:

class Constant {
const CONSTANT = 3;
public $test1 = "CONSTANT";
public $test2 = CONSTANT;
}

Podczas używania ReflectionClass::getDefaultProperties(); Otrzymuję następujące powiadomienie:

PHP Notice: Use of undefined constant CONSTANT - assumed "CONSTANT"

w tym wierszu kodu:

$defaultValues = $reflectionClass->getDefaultProperties();

Po pierwsze, zastanawiam się, dlaczego dostaję powiadomienie tutaj (to znaczy, nie mogę przewidzieć / uniknąć powiadomienia, mimo że kod jest w 100% poprawny)?

I po drugie, podczas korzystania var_export($defaultValues[3]), wyprowadza "CONSTANT" co jest normalne, ponieważ zostało rzutowane na ciąg.

Jak mogę wyprowadzać dane CONSTANT zamiast "CONSTANT" dla $test2 i nadal wyprowadza ciąg rozdzielany cudzysłowem dla $test1?

Edytować: dostaję CONSTANT w obu przypadkach ($test1 i $test2), ale z tego powodu nie mogę ich rozróżnić. Chcę wiedzieć: to jest ciąg znaków lub nazwa stałej.

Odpowiedzi:

2 dla odpowiedzi № 1

dlaczego dostaję powiadomienie tutaj?

ponieważ masz na myśli self::CONSTANT ale próbował użyć globalnego CONSTANTnp. twój kod zakłada

const CONSTANT = 3;              // global constant

class Constant {
const CONSTANT = 3;          // class constant
public $test1 = "CONSTANT";
public $test2 = CONSTANT;    // refers to global constant
}

ale chciałeś to zrobić:

class Constant {
const CONSTANT = 3;
public $test1 = "CONSTANT";
public $test2 = self::CONSTANT; // self indicated class scope
}

Z tym ostatnim

$reflectionClass = new ReflectionClass("Constant");
var_dump( $reflectionClass->getDefaultProperties() );

da

array(2) {
["test1"]=>
string(8) "CONSTANT"
["test2"]=>
int(3)
}

Czy istnieje sposób, aby uzyskać ["test2"] => self::CONSTANT poprzez odbicie? Nie. Refleksyjny interfejs API oceni stałą. Jeśli chcesz self::CONSTANT musisz wypróbować niektóre z interfejsów API odbicie statyczne innych firm.

I oczywiście, jeśli chcesz "CONSTANT", pisać ""CONSTANT"".

Odnośnie EDYCJI:

Dostaję STAŁĄ w obu przypadkach ($ test1 i $ test2), ale z tego powodu nie mogę ich rozróżnić. Chcę wiedzieć: to jest ciąg znaków lub to jest nazwa stałej.

$foo = CONSTANT oznacza przypisać stałą wartość do własności foo. Nie oznacza to przypisania stałej. Przypisując wartość do właściwości, nie jest ona już wartością stałą. Można go modyfikować. „Nazwa stałej” jest reprezentowana jako ciąg znaków. Możesz użyć ReflectionClass::hasConstant aby sprawdzić, czy ten ciąg znaków jest również nazwą zdefiniowanej stałej w klasie lub zastosowaniu defined dla stałych globalnych.


1 dla odpowiedzi nr 2

Ponieważ używasz CONSTANT dla wartości $ test2i nie definiuj go, zanim wygeneruje błąd „niezdefiniowana stała”. Czy chcesz użyć stałej klasy CONSTANT jako wartości dla publicznego $ test2? Następnie użyj publicznego $ test2 = self :: CONSTANT. W przeciwnym razie zdefiniuj CONSTANT jako stały przed klasą.

Należy pamiętać, że PHP rzuca wszystkie nieznane stałe jako ciągi znaków o wartości nazwy nieznanej stałej.