From 11813da84d4cf3eaaa631dbaac7d517b9f524c96 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 26 Aug 2024 17:09:29 +0200 Subject: [PATCH] Use Stringable when possible --- src/Error/Error.php | 2 +- src/Extension/CoreExtension.php | 4 ++-- src/Extension/SandboxExtension.php | 2 +- src/Extension/StringLoaderExtension.php | 5 ++--- src/Markup.php | 2 +- src/Runtime/EscaperRuntime.php | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Error/Error.php b/src/Error/Error.php index 4efd9cafb..61c309fa1 100644 --- a/src/Error/Error.php +++ b/src/Error/Error.php @@ -142,7 +142,7 @@ class Error extends \Exception } if ($this->name) { - if (\is_string($this->name) || (\is_object($this->name) && method_exists($this->name, '__toString'))) { + if (\is_string($this->name) || $this->name instanceof \Stringable) { $name = \sprintf('"%s"', $this->name); } else { $name = json_encode($this->name); diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 14dde136a..e8cf5f6f2 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -1191,7 +1191,7 @@ final class CoreExtension extends AbstractExtension return iterator_count($thing); } - if (method_exists($thing, '__toString')) { + if ($thing instanceof \Stringable) { return mb_strlen((string) $thing, $charset); } @@ -1328,7 +1328,7 @@ final class CoreExtension extends AbstractExtension return !iterator_count($value); } - if (\is_object($value) && method_exists($value, '__toString')) { + if ($value instanceof \Stringable) { return '' === (string) $value; } diff --git a/src/Extension/SandboxExtension.php b/src/Extension/SandboxExtension.php index 921df287a..4e96760f7 100644 --- a/src/Extension/SandboxExtension.php +++ b/src/Extension/SandboxExtension.php @@ -119,7 +119,7 @@ final class SandboxExtension extends AbstractExtension public function ensureToStringAllowed($obj, int $lineno = -1, ?Source $source = null) { - if ($this->isSandboxed($source) && \is_object($obj) && method_exists($obj, '__toString')) { + if ($this->isSandboxed($source) && $obj instanceof \Stringable) { try { $this->policy->checkMethodAllowed($obj, '__toString'); } catch (SecurityNotAllowedMethodError $e) { diff --git a/src/Extension/StringLoaderExtension.php b/src/Extension/StringLoaderExtension.php index 12f5c30aa..698d181f1 100644 --- a/src/Extension/StringLoaderExtension.php +++ b/src/Extension/StringLoaderExtension.php @@ -29,12 +29,11 @@ final class StringLoaderExtension extends AbstractExtension * * {{ include(template_from_string("Hello {{ name }}")) }} * - * @param string $template A template as a string or object implementing __toString() - * @param string|null $name An optional name of the template to be used in error messages + * @param string|null $name An optional name of the template to be used in error messages * * @internal */ - public static function templateFromString(Environment $env, $template, ?string $name = null): TemplateWrapper + public static function templateFromString(Environment $env, string|\Stringable $template, ?string $name = null): TemplateWrapper { return $env->createTemplate((string) $template, $name); } diff --git a/src/Markup.php b/src/Markup.php index 1788acc4f..4e83c9184 100644 --- a/src/Markup.php +++ b/src/Markup.php @@ -16,7 +16,7 @@ namespace Twig; * * @author Fabien Potencier */ -class Markup implements \Countable, \JsonSerializable +class Markup implements \Countable, \JsonSerializable, \Stringable { private $content; private $charset; diff --git a/src/Runtime/EscaperRuntime.php b/src/Runtime/EscaperRuntime.php index b1dac9640..5388b0d41 100644 --- a/src/Runtime/EscaperRuntime.php +++ b/src/Runtime/EscaperRuntime.php @@ -93,7 +93,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface } if (!\is_string($string)) { - if (\is_object($string) && method_exists($string, '__toString')) { + if ($string instanceof \Stringable) { if ($autoescape) { $c = \get_class($string); if (!isset($this->safeClasses[$c])) {