{"id":7170,"date":"2025-10-14T11:23:43","date_gmt":"2025-10-14T09:23:43","guid":{"rendered":"https:\/\/www.hostingtg.com\/blog\/?p=7170"},"modified":"2025-10-14T11:23:47","modified_gmt":"2025-10-14T09:23:47","slug":"php-8-5-noveades","status":"publish","type":"post","link":"https:\/\/www.hostingtg.com\/blog\/php-8-5-noveades\/","title":{"rendered":"PHP 8.5: novedades clave, ejemplos y c\u00f3mo aplicarlas sin romper tu c\u00f3digo"},"content":{"rendered":"\n<p>Cuando pienso en <strong>PHP 8.5<\/strong>, lo primero que me viene a la cabeza es la sensaci\u00f3n de madurez. Ya no estamos en la fase de \u201csaltar de versi\u00f3n porque hay una feature llamativa\u201d; ahora el foco est\u00e1 en pulir el d\u00eda a d\u00eda. En mi caso, esta versi\u00f3n me resulta m\u00e1s fluida y predecible, con decisiones de dise\u00f1o que favorecen la claridad y la legibilidad sin romper con el pasado. <\/p>\n\n\n\n<p>Esa continuidad se nota tanto en el c\u00f3digo que leo a diario como en la manera en que <strong>estructuro funciones, pruebas y despliegues<\/strong>. Y s\u00ed, aqu\u00ed el operador de canalizaci\u00f3n <code>|><\/code> tiene un papel protagonista, porque no solo <strong>simplifica la sintaxis<\/strong>: cambia la forma en que pienso los flujos de datos y me ayuda a escribir piezas m\u00e1s peque\u00f1as y componibles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 cambia realmente en PHP 8.5 (y por qu\u00e9 importa)<\/h2>\n\n\n\n<p>Lo que m\u00e1s valoro de PHP 8.5 es que reduce la fricci\u00f3n. Los cambios no se sienten como una carrera por incorporar \u201c<strong>la pr\u00f3xima gran cosa<\/strong>\u201d, sino como una estrategia sostenida para que las tareas habituales sean m\u00e1s n\u00edtidas. En proyectos que mantengo, pasar a 8.5 me ha dado un entorno de depuraci\u00f3n m\u00e1s informativo y una experiencia m\u00e1s consistente a nivel internacional, lo que se agradece enormemente cuando gestionas equipos distribuidos y entornos multiling\u00fces. La narrativa es clara: menos ceremonias, m\u00e1s foco en la <strong>intenci\u00f3n del programador<\/strong>. <\/p>\n\n\n\n<p>Esto se traduce en helpers que hacen lo obvio sin sustos, atributos que comunican intenci\u00f3n de forma expl\u00edcita y mejores trazas cuando algo se rompe en producci\u00f3n, justo cuando necesitas pistas fiables. He notado que la curva de lectura de c\u00f3digo ajeno baja: el lenguaje te empuja a patrones m\u00e1s expresivos, y esa ergonom\u00eda al final es tiempo que recuperas en cada revisi\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Operador <code>|&gt;<\/code> (pipe): pensar en flujos, no en variables<\/h2>\n\n\n\n<p>El pipe es la pieza que m\u00e1s me cambia el chip. Antes tend\u00eda a encadenar llamadas con variables \u201cpegamento\u201d o a anidar funciones hasta perder el hilo. Con <code>|&gt;<\/code> el flujo queda en l\u00ednea, cercano a c\u00f3mo lo describir\u00edas en voz alta: tomar datos, normalizarlos, validarlos, transformarlos y renderizarlos. En mi pr\u00e1ctica, el beneficio no est\u00e1 solo en ahorrar caracteres, sino en que la lectura sigue el orden de la historia que quieres contar. Me pasa que ahora detecto antes las responsabilidades que sobran, porque cada etapa del pipeline te obliga a pensar qu\u00e9 devuelve y qu\u00e9 consume la siguiente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Antes: anidado y con variables temporales\n$result = render(\n    transform(\n        validate(\n            normalize($input)\n        )\n    )\n);\n\n\/\/ Ahora: flujo expl\u00edcito con pipe\n$input\n  |> normalize(_)\n  |> validate(_)\n  |> transform(_)\n  |> render(_);\n<\/code><\/pre>\n\n\n\n<p>En APIs y en procesamientos de colecciones, este estilo me ha quitado ruido. Me encuentro refactorizando menos y, cuando lo hago, los diffs son cortos y obvios. Cuando prob\u00e9 a reescribir una ruta que constru\u00eda un DTO a partir de varias fuentes, el pipeline dej\u00f3 la intenci\u00f3n cristalina y me ayud\u00f3 a aislar efectos secundarios. A ese nivel, la <strong>ganancia cognitiva es real<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nuevos helpers de arrays: <code>array_first()<\/code> y <code>array_last()<\/code> sin sorpresas<\/h2>\n\n\n\n<p>Otra mejora que agradezco es tener funciones claras para obtener el primer y \u00faltimo elemento. En PHP 8.5, <code><strong>array_first()<\/strong><\/code> y <code><strong>array_last()<\/strong><\/code> devuelven exactamente lo que esperas y, si el array est\u00e1 vac\u00edo, el valor es <code>null<\/code>. Esta decisi\u00f3n elimina ambig\u00fcedades y evita esos microbugs que nacen de suposiciones. Cuando trabajo con colecciones que llegan de la base de datos o de un servicio externo, prefiero que el lenguaje me d\u00e9 una se\u00f1al inequ\u00edvoca de \u201cno hay elemento\u201d sin tener que inventar convenciones. Tambi\u00e9n lo noto en pruebas: la intenci\u00f3n de los asserts queda m\u00e1s directa y no tengo que manipular punteros internos del array.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$names = &#91;'Ada', 'Linus', 'Rasmus'];\n\n$first = array_first($names); \/\/ 'Ada'\n$last  = array_last($names);  \/\/ 'Rasmus'\n\n$empty = &#91;];\n$none  = array_first($empty); \/\/ null\n<\/code><\/pre>\n\n\n\n<p>A nivel de rendimiento, en mi experiencia la discusi\u00f3n es secundaria frente a la legibilidad y la seguridad sem\u00e1ntica. Para el 99% de los casos, la decisi\u00f3n acertada es optimizar para el lector humano; 8.5 empuja en esa direcci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Depuraci\u00f3n con trazas en errores fatales: activa <code>fatal_error_backtraces<\/code><\/h2>\n\n\n\n<p>Cuando ocurre un fatal error en producci\u00f3n, lo que necesitas es contexto. Con PHP 8.5, <strong>habilitar las trazas en errores fatales<\/strong> a trav\u00e9s de la directiva <code><strong>fatal_error_backtraces<\/strong><\/code> te da exactamente eso: una cadena de llamadas que te permite ubicar el origen real del problema. En incidentes nocturnos lo he agradecido mucho; el tiempo que ahorras entre ver el error y entender por qu\u00e9 pas\u00f3 se acorta. La diferencia pr\u00e1ctica es que ya no te quedas con un mensaje cr\u00edptico y un archivo suelto, sino con un hilo completo al que tirar. <\/p>\n\n\n\n<p>Mi recomendaci\u00f3n es activarlo primero en <strong><a href=\"https:\/\/www.hostingtg.com\/blog\/theme-switcha-cambiar-de-tema-en-wordpress\/\">entornos de staging<\/a><\/strong> y registrar el resultado con un handler que anonimize datos sensibles, y despu\u00e9s graduarlo en producci\u00f3n con el nivel de detalle que tu pol\u00edtica de logs permita.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; php.ini o per-dir\nfatal_error_backtraces = On\n<\/code><\/pre>\n\n\n\n<p>La lectura de estas trazas, combinada con tu logger, te habilita para acotar regresiones tras un despliegue. A m\u00ed me ha permitido cerrar incidentes con menos conjeturas y m\u00e1s evidencia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>#[\\NoDiscard]<\/code>, atributos en constantes y otras mejoras de legibilidad<\/h2>\n\n\n\n<p>La anotaci\u00f3n <code>#[\\NoDiscard]<\/code> es una peque\u00f1a gran idea: si decoras una funci\u00f3n o resultado y el valor devuelto se ignora, el motor puede advertirte. Este tipo de feedback da disciplina al dise\u00f1o de APIs, porque explicita que \u201cesto devuelve algo que probablemente deber\u00edas usar\u201d. En mis revisiones de c\u00f3digo ya he detectado llamadas silenciosas que en realidad pretend\u00edan transformar datos; con el atributo, el error salta antes y el coste de aprendizaje baja para quien toca el m\u00f3dulo por primera vez.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#&#91;\\NoDiscard]\nfunction computeInvoiceTotal(Invoice $invoice): Money {\n    \/\/ ...\n    return $total;\n}\n\n\/\/ Advertir\u00e1 si haces esto:\ncomputeInvoiceTotal($invoice); \/\/ valor ignorado\n<\/code><\/pre>\n\n\n\n<p>Los atributos en constantes cierran otro c\u00edrculo de expresividad. Configurar cat\u00e1logos, estados de dominio o flags con metadatos adjuntos se vuelve m\u00e1s claro y cercano al problema que modelas. He usado esta idea para documentar casos de uso y generar validaciones autom\u00e1ticas en tests, y la coherencia que consigues en el repositorio compensa con creces el m\u00ednimo coste de adopci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>enum Status: string {\n    #&#91;Label('Pendiente de pago')]\n    case Pending = 'pending';\n\n    #&#91;Label('Pagado')]\n    case Paid = 'paid';\n}\n<\/code><\/pre>\n\n\n\n<p>Cuando prob\u00e9 esta aproximaci\u00f3n en un panel interno, los <strong>desarrolladores nuevos<\/strong> entendieron m\u00e1s r\u00e1pido la intenci\u00f3n de cada estado porque la documentaci\u00f3n vive junto al valor que la necesita.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Closures y callables en expresiones constantes: patrones pr\u00e1cticos<\/h2>\n\n\n\n<p>Disponer de closures y callables en expresiones constantes abre patrones interesantes para factorizar comportamientos sin sobredise\u00f1ar. La idea de \u201cpegar\u201d un peque\u00f1o comportamiento a un valor del dominio es muy \u00fatil para enriquecer enums o para inyectar formateos que no merecen una clase. En mi caso, esto ha simplificado transformaciones repetidas que antes resolv\u00eda con utilidades globales o contructores est\u00e1ticos dispersos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const FORMATTERS = &#91;\n    'money' => fn (int $cents) => sprintf('\u20ac %.2f', $cents \/ 100),\n    'slug'  => fn (string $s) => strtolower(trim(preg_replace('\/\\s+\/', '-', $s))),\n];\n<\/code><\/pre>\n\n\n\n<p>El resultado pr\u00e1ctico es menos tr\u00e1nsito innecesario entre capas y una sem\u00e1ntica m\u00e1s cercana al punto de uso. Al final, lees el mapa y entiendes qu\u00e9 hace cada entrada sin saltos mentales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migrar de 8.4 a 8.5: c\u00f3mo lo hago sin dramas<\/h2>\n\n\n\n<p>Mi estrategia de migraci\u00f3n prioriza seguridad y feedback temprano. Primero fijo la versi\u00f3n en CI y ejecuto la bater\u00eda de pruebas con PHP 8.5 en paralelo a 8.4 para comparar fallos y tiempos. Despu\u00e9s valido extensiones y m\u00f3dulos de PHP del entorno real, desde el gestor del servidor hasta los paquetes del sistema, para evitar sorpresas en despliegue. Cuando encuentro un comportamiento distinto, acoto el cambio con pruebas unitarias m\u00ednimas que reproduzcan el caso y documento el motivo en el propio test. <\/p>\n\n\n\n<p>Me gusta tambi\u00e9n encender las trazas de errores fatales en staging y elevar el nivel de reporting para cazar warnings que suelen anunciar deprecaciones futuras. Por \u00faltimo, hago un canary release con telemetr\u00eda granular durante unas horas, monitorizando latencias y ratio de errores; si todo permanece estable, el corte definitivo es inmediato. En mi experiencia, php 8.5 encaja con esa filosof\u00eda de \u201cno romper\u201d, as\u00ed que el mayor trabajo suele estar en ajustar dependencias externas y no en el c\u00f3digo de dominio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Impacto en frameworks (Laravel, WordPress) y patrones cotidianos<\/h2>\n\n\n\n<p>En frameworks populares, PHP 8.5 refuerza patrones que ya usamos. En Laravel, por ejemplo, el operador <code>|><\/code> se siente natural cuando compones colecciones, validas datos de request o encadenas transformaciones con objetos inmutables; las rutas que producen respuestas JSON fluyen de manera m\u00e1s directa y la intenci\u00f3n se percibe en la primera lectura. <\/p>\n\n\n\n<p>En WordPress, donde conviven piezas hist\u00f3ricas con desarrollo moderno, helpers como <code>array_first()<\/code> y <code>array_last()<\/code> limpian mucha l\u00f3gica defensiva, y los atributos en constantes ayudan a documentar y automatizar reglas en plugins con dominios complejos. En ambos ecosistemas, el enfoque de php 8.5 hacia una depuraci\u00f3n m\u00e1s informativa facilita mantener sitios con alto tr\u00e1fico porque los incidentes dejan m\u00e1s rastro y la resoluci\u00f3n es m\u00e1s \u00e1gil. Yo lo he notado sobre todo en tareas de mantenimiento: menos tiempo releyendo utilidades gen\u00e9ricas y m\u00e1s foco en el caso de negocio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preguntas frecuentes de PHP 8.5 (respuestas al grano)<\/h2>\n\n\n\n<p>La duda m\u00e1s repetida que recibo es cu\u00e1ndo conviene dar el salto si sigues en 8.1 u 8.2. Mi respuesta es que, salvo bloqueos por hosting o extensiones cr\u00edticas, merece la pena planificar la actualizaci\u00f3n porque la ganancia en legibilidad y el refuerzo en depuraci\u00f3n se notan desde el primer sprint. Otra cuesti\u00f3n recurrente es si el operador <code>|><\/code> penaliza el rendimiento; en mis pruebas informales la diferencia pr\u00e1ctica es despreciable frente al impacto positivo en claridad, y en equipos de tama\u00f1o medio el ahorro en tiempo de lectura compensa cualquier microvarianza. <\/p>\n\n\n\n<p>Tambi\u00e9n suele inquietar el cambio en requisitos del entorno: lo sensato es replicar tu producci\u00f3n en staging con la nueva versi\u00f3n, validar extensiones y observar logs durante unas horas con tr\u00e1fico real, y solo entonces cortar. Por \u00faltimo, muchos preguntan si <code>array_first()<\/code> y <code>array_last()<\/code> devuelven algo \u201craro\u201d con arrays vac\u00edos; el contrato es expl\u00edcito y devuelve <code>null<\/code>, justo lo que esperas si no hay elementos, lo que simplifica ramificaciones y hace tus guard clauses m\u00e1s.<\/p>\n\n\n\n<p>El resultado pr\u00e1ctico es menos tr\u00e1nsito innecesario entre capas y una sem\u00e1ntica m\u00e1s cercana al punto de uso. Al final, lees el mapa y entiendes qu\u00e9 hace cada entrada sin saltos mentales.<\/p>\n\n\n\n<p><strong>Opini\u00f3n Personal<\/strong><\/p>\n\n\n\n<p>Confieso que PHP 8.5 me ha reconciliado con una idea que a veces olvidamos en el desarrollo: la evoluci\u00f3n no siempre va de romper moldes, sino de pulir lo que de verdad usamos cada d\u00eda. Esta versi\u00f3n se siente como ese refactor que no presume en la demo, pero que te ahorra minutos \u2014y dolores de cabeza\u2014 en cada sprint. Lo noto cuando leo c\u00f3digo ajeno y la intenci\u00f3n aparece antes que la implementaci\u00f3n. <\/p>\n\n\n\n<p>Lo noto cuando encadeno transformaciones con el operador <code>|><\/code> y el flujo de datos deja de ser un laberinto para convertirse en una historia lineal que cualquiera del equipo entiende al vuelo. Lo noto cuando un error fatal no me abandona con un mensaje cr\u00edptico, sino que me ofrece una traza que me gu\u00eda con precisi\u00f3n quir\u00fargica al punto d\u00e9bil. Y, sobre todo, lo noto en c\u00f3mo el lenguaje me empuja a escribir APIs m\u00e1s expresivas, con atributos que comunican intenci\u00f3n y helpers que devuelven exactamente lo que esperas, sin efectos secundarios sorpresa.<\/p>\n\n\n\n<p>No es un enamoramiento a primera vista, es respeto ganado a base de decisiones sensatas. PHP 8.5 no te pide rehacer tu mentalidad ni cambiar tus herramientas; te acompa\u00f1a en lo que ya haces y te lo hace m\u00e1s claro. En mi experiencia, los peque\u00f1os detalles marcan la diferencia: menos \u201cvariables pegamento\u201d, m\u00e1s lectura natural; menos cazas de fantasmas, m\u00e1s evidencia en los logs; menos utilidades ceremoniosas, m\u00e1s c\u00f3digo que habla el idioma del dominio. <\/p>\n\n\n\n<p>En un entorno donde el tiempo de comprensi\u00f3n vale tanto como el tiempo de ejecuci\u00f3n, esa claridad paga dividendos. \u00bfRendimiento? En la pr\u00e1ctica, el mayor boost llega cuando el equipo lee y modifica m\u00e1s r\u00e1pido, cuando las decisiones de dise\u00f1o se vuelven obvias y los tests cuentan una historia coherente. Esa es la verdadera optimizaci\u00f3n: la que reduce fricci\u00f3n y multiplica el foco.<\/p>\n\n\n\n<p>Por eso mi postura es clara: si tu proyecto vive de la estabilidad, si tus despliegues no admiten juegos pirot\u00e9cnicos y si valoras la legibilidad por encima del brillo pasajero, PHP 8.5 merece un hueco en tu hoja de ruta. No por hype, sino por oficio. Es una versi\u00f3n que escucha a la comunidad y devuelve herramientas que elevan el est\u00e1ndar sin exigir peajes imposibles. Y si, como yo, disfrutas cuando el c\u00f3digo se explica solo, aqu\u00ed vas a sentirte en casa.<\/p>\n\n\n\n<p>Ahora te toca a ti: \u00bfqu\u00e9 te ha cambiado a ti en el <strong>d\u00eda a d\u00eda con PHP 8.5<\/strong>? \u00bfHas probado el pipe en un caso real, te han salvado las trazas en un incidente, o sigues dudando si migrar? Cu\u00e9ntamelo abajo en los comentarios; leer tu experiencia enriquece la conversaci\u00f3n y puede ser la pista que otro desarrollador necesita para dar el paso.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando pienso en PHP 8.5, lo primero que me viene a la cabeza es la sensaci\u00f3n de madurez. Ya no estamos en la fase de \u201csaltar de versi\u00f3n porque hay una feature llamativa\u201d; ahora el foco est\u00e1 en pulir el d\u00eda a d\u00eda. En mi caso, esta versi\u00f3n me resulta m\u00e1s fluida y predecible, con [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7171,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[786,989,1146,1145,1144],"class_list":["post-7170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-noticias","tag-apache","tag-php","tag-php-8","tag-php-fpm","tag-servidor-web"],"_links":{"self":[{"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/posts\/7170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/comments?post=7170"}],"version-history":[{"count":3,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/posts\/7170\/revisions"}],"predecessor-version":[{"id":7174,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/posts\/7170\/revisions\/7174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/media\/7171"}],"wp:attachment":[{"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/media?parent=7170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/categories?post=7170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostingtg.com\/blog\/wp-json\/wp\/v2\/tags?post=7170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}