diff --git a/src/gen_stub.php b/src/gen_stub.php index 5b65c0c5..ff1406a0 100755 --- a/src/gen_stub.php +++ b/src/gen_stub.php @@ -2515,14 +2515,20 @@ class EvaluatedValue return '"' . getTranslator()->escapeString((string) $this->value) . '"'; } elseif ($this->expr instanceof Expr\ConstFetch) { return getTranslator()->getConstValue($this->expr->name->toString()); - } elseif (!($this->expr instanceof String_)) { + } elseif ($this->expr instanceof String_) { + // Heredoc/nowdoc and quoted string literals: emit the decoded + // value directly. Pretty-printing a heredoc/nowdoc would leak + // the `<<escapeString((string) $this->value) . '"'; + } else { // ConstExprEvaluator has already reduced concatenations and // other constant string expressions to their PHP value. Emit // that value as a C string literal instead of rejecting every // non-literal string expression. return '"' . getTranslator()->escapeString((string) $this->value) . '"'; } - $expr = preg_replace("/(^'|'$)/", '"', getTranslator()->escapeString($expr)); } elseif ($this->type->isInt() or $this->type->isFloat()) { return strval($this->value); } elseif ($this->type->isBool()) { @@ -5107,6 +5113,13 @@ function parseFunctionLike( if ($param->default instanceof Expr\ClassConstFetch && $param->default->class->toLowerString() === "self") { $defaultValue = getTranslator()->getClassConstValue($func, $name->className->name, $param->default->name->name); $defaultValue = var_export($defaultValue, true); + } elseif ($param->default instanceof String_ && + in_array($param->default->getAttribute('kind'), [String_::KIND_HEREDOC, String_::KIND_NOWDOC], true) + ) { + // heredoc/nowdoc: prettyPrint 会输出 `<<escapeString((string) $param->default->value) . '"'; } else { $defaultValue = $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null; } diff --git a/tests/compiler/const/class-const-heredoc-nowdoc.phpt b/tests/compiler/const/class-const-heredoc-nowdoc.phpt new file mode 100644 index 00000000..350c1ad7 --- /dev/null +++ b/tests/compiler/const/class-const-heredoc-nowdoc.phpt @@ -0,0 +1,23 @@ +--TEST-- +class constants with heredoc and nowdoc syntax +--FILE-- + +--EXPECT-- +string(3) "abc" +string(3) "def" diff --git a/tests/compiler/const/heredoc-nowdoc-const-defaults.phpt b/tests/compiler/const/heredoc-nowdoc-const-defaults.phpt new file mode 100644 index 00000000..07868984 --- /dev/null +++ b/tests/compiler/const/heredoc-nowdoc-const-defaults.phpt @@ -0,0 +1,38 @@ +--TEST-- +global constants, property defaults and parameter defaults with heredoc/nowdoc syntax +--FILE-- +p); + var_dump(with_default()); +} +?> +--EXPECT-- +string(3) "abc" +string(3) "def" +string(3) "xyz" +string(3) "abc"