# Introducció

PHP és un llenguatge de programació **interpretat i del costat del servidor**, creat per **Rasmus Lerdorf el 1994**, inicialment com *Personal Home Page*, avui significat **PHP: Hypertext Preprocessor**. Ha evolucionat millorant rendiment, seguretat i suport a la programació orientada a objectes, arribant a les versions 8.x.

Sintaxi i comentaris

El codi PHP s’escriu dins de &lt;?php ... ?&gt; i cada instrucció acaba amb ;.  
Comentaris:

- Una línia: // o #
- Multilínia: /\* ... \*/

Mostrar informació

- echo → imprimir text o variables
- print → imprimir i retornar 1
- print\_r() i var\_dump() → útils per arrays i objectes
- die() → mostra un missatge i atura l’script

Variables

Comencen amb $ i PHP assigna el tipus automàticament.  
Tipus habituals: string, integer, float, boolean, array, objecte, null  
Exemple: $nom = "Joan"; $edat = 25; $actiu = true;

# Introducció

**PHP és un llenguatge de programació interpretat** del costat del servidor i d’ús general que s’adapta especialment al desenvolupament web. Va ser creat inicialment pel programador danès-canadenc Rasmus Lerdorf l’any 1994. En l’actualitat, la implementació de referència de PHP és produïda per *The PHP Group*. Originalment, PHP significava ***P**ersonal **H**ome **P**age* (Pàgina personal), però ara significa l’inicialisme recursiu *PHP: **H**ypertext **P**re**p**rocessor*.

El codi PHP sol ser processat en un servidor web per un intèrpret PHP desenvolupat com a mòdul, *daemon* o com a executable d’interfície d’entrada comuna (CGI). En un servidor web, el resultat del codi PHP interpretat i executat —que pot ser qualsevol tipus de dades, com l’HTML generat o dades d’imatges binàries— formaria la totalitat o part d’una resposta HTTP. Existeixen diversos sistemes de plantilles, sistemes de gestió de continguts i *frameworks* que poden emprar-se per organitzar o facilitar la generació d’aquesta resposta. D’altra banda, PHP pot utilitzar-se per a moltes tasques de programació fora del context web, com aplicacions gràfiques autònomes i el control de drons. També es pot interpretar i executar qualsevol codi PHP a través d’una interfície de línia d’ordres (CLI).

L’intèrpret estàndard de PHP, impulsat pel *Zend Engine*, és un programari lliure publicat sota Llicència PHP. PHP ha estat àmpliament portat i pot ser desplegat en la majoria de servidors web en gairebé tots els sistemes operatius i plataformes, de manera gratuïta.

El llenguatge PHP va evolucionar sense una especificació formal escrita ni un estàndard fins al 2014, amb la implementació original actuant com l’estàndard de facto que altres implementacions intentaven seguir. Des del 2014, s’ha treballat per crear una especificació formal de PHP.

### Visió general

PHP pot ser desplegat en la majoria dels servidors web i en tots els sistemes operatius i plataformes sense cap cost. El llenguatge PHP es troba instal·lat en més de 20 milions de llocs web i en un milió de servidors. Migrar els serveis basats en PHP cap a les noves tecnologies que apareixen suposa un cost que cal justificar monetàriament (sobretot en termes de maquinari i rendiment). Per això, es parla de si el nombre de llocs basats en PHP s’ha vist reduït progressivament en els darrers anys, amb l’aparició de noves tecnologies com Node.js, Golang, ASP.NET, etc.

PHP com tot, està evolucionant avui dia, hi ha disponibles noves llibreries, l’ús de matrius, la gestió de nombres enters, el tractament de la criptografia quan s’utilitza un Base64, el *web scraping*, la indexació de webs, el precuinat de dades, *big data*, conjunts de dades, la supervisió de dades i conjunts de proposicions dimensionals. Com veiem, una visió general d’aquest llenguatge és molt més complexa que afirmar que és un llenguatge per al desenvolupament web. El lloc web de la Viquipèdia està desenvolupat en PHP. És també el mòdul Apache més popular entre els ordinadors que utilitzen Apache com a servidor web.

La gran semblança que té PHP amb els llenguatges més comuns de programació estructurada, com C i Perl, permet a la majoria dels programadors crear aplicacions complexes amb una corba d’aprenentatge molt curta. També els permet involucrar-se en aplicacions de contingut dinàmic sense haver d’aprendre tot un nou conjunt de funcions.

Tot i que en el seu disseny tot està orientat a facilitar la creació de llocs web, és possible crear aplicacions amb una interfície gràfica d’usuari, utilitzant alguna extensió com pot ser PHP-Qt, PHP-GTK, WxPHP, WinBinder, Roadsend PHP, Phalanger, Phc o HipHop VM. També pot ser utilitzat des de la línia d’ordres, de la mateixa manera que Perl o Python poden fer-ho; a aquesta versió de PHP se l’anomena **PHP-CLI** (*Command Line Interface*).

Quan el client fa una petició al servidor perquè li enviï una pàgina web, el servidor executa l’intèrpret de PHP. Aquest processa l’*script* sol·licitat, que generarà el contingut de manera dinàmica (per exemple, obtenint informació d’una base de dades). El resultat és enviat per l’intèrpret al servidor, que al seu torn l’envia al client.

Permet la connexió a diferents tipus de servidors de bases de dades, tant SQL com NoSQL, com ara MySQL, PostgreSQL, Oracle, ODBC, DB2, Microsoft SQL Server, Firebird, SQLite o MongoDB.

PHP també té la capacitat de ser executat en la majoria dels sistemes operatius, com Unix (i derivats, com Linux o Mac OS X) i Microsoft Windows, i pot interactuar amb els servidors web més populars, ja que existeix en versió CGI, com a mòdul per a Apache i com a ISAPI.

PHP és una alternativa a les tecnologies de Microsoft ASP i ASP.NET (que utilitza C# i Visual Basic .NET com a llenguatges), a ColdFusion de l’empresa Adobe, a JSP/Java, CGI/Perl i a Node.js/JavaScript. Tot i que la seva creació i desenvolupament es produeix en l’àmbit dels sistemes lliures, sota la llicència GNU, existeix també un entorn de desenvolupament integrat comercial anomenat Zend Studio.

### Història

Va ser originalment dissenyat en Perl, a partir de l’escriptura d’un grup de CGI binaris escrits en llenguatge C pel programador danès-canadenc Rasmus Lerdorf l’any 1994 per mostrar el seu currículum vitae i desar certes dades, com la quantitat de trànsit que la seva pàgina web rebia. El 8 de juny de 1995 es va publicar ***P**ersonal **H**ome **P**age Tools* després que Lerdorf el combinés amb el seu propi *Form Interpreter* per crear PHP/FI.

Dos programadors israelians del Technion, Zeev Suraski i Andi Gutmans, van reescriure l’analitzador sintàctic (*parser*, en anglès) el 1997 i van crear la base del PHP3, i van canviar el nom del llenguatge per PHP: *Hypertext Preprocessor*. Immediatament van començar les experimentacions públiques de PHP3, i es va publicar oficialment el juny de 1998. L’any 1999, Suraski i Gutmans van reescriure el codi de PHP i van produir el que avui es coneix com a motor Zend. També van fundar Zend Technologies a Ramat Gan, Israel.

El maig de 2000, es va llançar PHP 4 sota la potència del motor Zend 1.0. El 13 de juliol de 2007 es va anunciar la suspensió del suport i desenvolupament de la versió 4 de PHP, i, malgrat el que s’havia anunciat, es va alliberar una nova versió amb millores de seguretat, la 4.4.8, publicada el 13 de gener de 2008, i posteriorment la versió 4.4.9, publicada el 7 d’agost de 2008. Segons aquesta notícia, se li va donar suport a errors crítics fins al 9 d’agost de 2008.

El 13 de juliol de 2004 es va llançar PHP 5, utilitzant el motor Zend Engine 2.0 (o Zend Engine 2). Inclou tots els avantatges que ofereix el nou Zend Engine 2, com ara:

- Millor suport per a la programació orientada a objectes, que en versions anteriors era extremadament rudimentari.
- Millores de rendiment.
- Millor suport per a MySQL amb extensió completament reescrita.
- Millor suport a XML (XPath, DOM, etc.).
- Suport natiu per a SQLite.
- Suport integrat per a SOAP.
- Iteradors de dades.
- Gestió d’excepcions.
- Millores amb la implementació amb Oracle.

A l’abril de 2020, més de la meitat dels llocs web que feien servir PHP continuaven en la versió discontinuada 5.6 o anterior, i amb la versió 7.0 i 7.1 més del 68 %, que no estan oficialment suportades per *The PHP Development Team*, mentre que el suport de seguretat és proporcionat per tercers, com Debian (fins al juny de 2020 per a PHP 5). A més, la versió 7.2, la versió amb suport més popular, va deixar de rebre actualitzacions de seguretat el 30 de novembre de 2020.

El 26 de novembre de 2020 es presenta l’actualització del llenguatge PHP a la seva versió 8.0, amb més recursos i optimitzacions, incloent-hi arguments amb nom, tipus d’unió, atributs, promoció de propietats constructives, expressions *match*, operador *nullsafe*, JIT (traducció dinàmica) i també millores en el sistema de tipus, gestió d’errors i consistència en general. Aquesta versió va finalitzar el novembre de 2023. També cal considerar que a partir del llançament de PHP 8.2, el 8 de novembre de 2022, WordPress va aconseguir ser compatible l’endemà, 9 de desembre de 2022, seguit del *framework* CodeIgniter, que va expulsar PHP 7.4 de les seves compatibilitats en les noves actualitzacions.

**Al gener de 2023, segons W3Techs, PHP s'utilitzava pel 77,8 %** de tots els llocs web que s’executen al costat del servidor. També diu que només el 8% dels usuaris de PHP utilitzen les versions 8.x actualment suportades. L’última versió publicada de PHP és PHP 8.4.

# Versions

<table class="wikitable" id="bkmrk-versi%C3%B3n-fecha-de-lan" style="width: 100%; height: 2113.19px;"><tbody><tr style="height: 29.7969px;"><th style="width: 11.323%; height: 29.7969px;">**Versión**</th><th style="width: 23.242%; height: 29.7969px;">**Fecha de lanzamiento**</th><th style="width: 18.7177%; height: 29.7969px;">**Fin de soporte**</th><th style="width: 46.7173%; height: 29.7969px;">**Notas**</th></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">1.0</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">08-06-1995</td><td style="width: 18.7177%; height: 67.0469px;"> </td><td style="width: 46.7173%; height: 67.0469px;">Llamada oficialmente «Personal Home Page Tools (PHP Tools)». Es la primera versión en usar el nombre «PHP».<sup class="mw-references reference separada" id="bkmrk-"></sup>​</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">2.0</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">01-11-1997</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;"> </td><td style="width: 46.7173%; height: 67.0469px;">Considerada por sus creadores la «herramienta más rápida y sencilla» para crear páginas web dinámicas.<sup class="mw-references reference separada" id="bkmrk--1"></sup>​</td></tr><tr style="height: 50.25px;"><td class="align-center" style="width: 11.323%; height: 50.25px;">3.0</td><td class="align-center" style="width: 23.242%; height: 50.25px;">06-06-1998</td><td class="align-center" style="width: 18.7177%; height: 50.25px;">20-10-2000</td><td style="width: 46.7173%; height: 50.25px;">Zeev Suraski y Andi Gutmans reescribieron la base para esta versión.<sup class="mw-references reference separada" id="bkmrk--2"></sup>​</td></tr><tr style="height: 50.25px;"><td class="align-center" style="width: 11.323%; height: 50.25px;">4.0</td><td class="align-center" style="width: 23.242%; height: 50.25px;">22-05-2000</td><td class="align-center" style="width: 18.7177%; height: 50.25px;">23-01-2001</td><td style="width: 46.7173%; height: 50.25px;">Se añadió un sistema de parsing de dos fases llamado motor Zend.<sup class="mw-references reference separada" id="bkmrk--3"></sup>​</td></tr><tr style="height: 50.5625px;"><td class="align-center" style="width: 11.323%; height: 50.5625px;">4.1</td><td class="align-center" style="width: 23.242%; height: 50.5625px;">10-12-2001</td><td class="align-center" style="width: 18.7177%; height: 50.5625px;">12-03-2002</td><td style="width: 46.7173%; height: 50.5625px;">Se introducen 'superglobales' (`$_GET`, `$_POST`, `$_SESSION`, etc.)<sup class="mw-references reference separada" id="bkmrk--4"></sup>​</td></tr><tr style="height: 100.953px;"><td class="align-center" style="width: 11.323%; height: 100.953px;">4.2</td><td class="align-center" style="width: 23.242%; height: 100.953px;">22-04-2002</td><td class="align-center" style="width: 18.7177%; height: 100.953px;">06-09-2002</td><td style="width: 46.7173%; height: 100.953px;">Se deshabilitan `register_globals` por defecto. Datos recibidos por la red no son insertados en el espacio de nombres global, cerrando posibles agujeros de seguridad en las aplicaciones.<sup class="mw-references reference separada" id="bkmrk--5"></sup>​</td></tr><tr style="height: 36.0469px;"><td class="align-center" style="width: 11.323%; height: 36.0469px;">4.3</td><td class="align-center" style="width: 23.242%; height: 36.0469px;">27-12-2002</td><td class="align-center" style="width: 18.7177%; height: 36.0469px;">31-03-2005</td><td style="width: 46.7173%; height: 36.0469px;">Se introduce CLI, y CGI.<sup class="mw-references reference separada" id="bkmrk--6"></sup>​</td></tr><tr style="height: 50.875px;"><td class="align-center" style="width: 11.323%; height: 50.875px;">4.4</td><td class="align-center" style="width: 23.242%; height: 50.875px;">11-07-2005</td><td class="align-center" style="width: 18.7177%; height: 50.875px;">07-08-2008</td><td style="width: 46.7173%; height: 50.875px;">Se añaden páginas man para `phpize` y `php-config`.<sup class="mw-references reference separada" id="bkmrk--7"></sup>​</td></tr><tr style="height: 50.25px;"><td class="align-center" style="width: 11.323%; height: 50.25px;">5.0</td><td class="align-center" style="width: 23.242%; height: 50.25px;">13-07-2004</td><td class="align-center" style="width: 18.7177%; height: 50.25px;">05-09-2005</td><td style="width: 46.7173%; height: 50.25px;">Motor Zend II con un nuevo modelo de objetos.<sup class="mw-references reference separada" id="bkmrk--8"></sup>​</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">5.1</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">24-11-2005</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;">24-08-2006</td><td style="width: 46.7173%; height: 67.0469px;">Mejoras de rendimiento con la introducción de variables de compilador para el nuevo motor de PHP.<sup class="mw-references reference separada" id="bkmrk--9"></sup>​</td></tr><tr style="height: 52.8438px;"><td class="align-center" style="width: 11.323%; height: 52.8438px;">5.2</td><td class="align-center" style="width: 23.242%; height: 52.8438px;">02-11-2006</td><td class="align-center" style="width: 18.7177%; height: 52.8438px;">06-01-2011</td><td style="width: 46.7173%; height: 52.8438px;">Actividad extensión de filtro por defecto. Soporte JSON nativo.<sup class="mw-references reference separada" id="bkmrk--10"></sup>​</td></tr><tr style="height: 236.938px;"><td class="align-center" style="width: 11.323%; height: 236.938px;">5.3</td><td class="align-center" style="width: 23.242%; height: 236.938px;">30-06-2009</td><td class="align-center" style="width: 18.7177%; height: 236.938px;">14-08-2014<sup class="mw-references reference separada" id="bkmrk--11"></sup>​</td><td style="width: 46.7173%; height: 236.938px;">Soporte para espacios de nombres, enlace estático en tiempo de ejecución, etiqueta de salto (GOTO limitada), Clausuras nativas, Soporte nativo para archivos PHP (phar), recolección de basura para referencias circulares, soporte mejorado para Windows, sqlite3, mysqlnd como reemplazo a libmysql como biblioteca para extensiones que funcionan con MySQL, fileinfo como reemplazado de mime\_magic para mejor soporte MIME, extensión de Internacionalización, y etiqueta ereg obsoleta.</td></tr><tr style="height: 174.672px;"><td class="align-center" style="width: 11.323%; height: 174.672px;">5.4</td><td class="align-center" style="width: 23.242%; height: 174.672px;">01-03-2012</td><td class="align-center" style="width: 18.7177%; height: 174.672px;">15-09-2015</td><td style="width: 46.7173%; height: 174.672px;">Soporte para Trait y sintaxis abreviada de array. Elementos eliminados: `register_globals`, `safe_mode`, `allow_call_time_pass_reference`, `session_register()`, `session_unregister()` y `session_is_registered()`. Servidor web incorporado.<sup class="mw-references reference separada" id="bkmrk--12"></sup> Varias mejoras a características existentes y al rendimiento, y requerimientos de memoria menores.</td></tr><tr style="height: 67.3594px;"><td class="align-center" style="width: 11.323%; height: 67.3594px;">5.5</td><td class="align-center" style="width: 23.242%; height: 67.3594px;">20-06-2013</td><td class="align-center" style="width: 18.7177%; height: 67.3594px;">20-06-2016</td><td style="width: 46.7173%; height: 67.3594px;">Nuevos generadores para bucles, `empty()` soporta expresiones. Se pierde el soporte para Windows XP y Windows Server 2003.<sup class="mw-references reference separada" id="bkmrk--13"></sup>​</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">5.6</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">20-08-2014</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;">31-12-2018</td><td style="width: 46.7173%; height: 67.0469px;">Constantes con expresiones escalares, listas de argumentos de longitud variable y exponencial mediante el operador \*\*.<sup class="mw-references reference separada" id="bkmrk--14"></sup>​</td></tr><tr style="height: 221.875px;"><td class="align-center" style="width: 11.323%; height: 221.875px;">6</td><td rowspan="" style="width: 23.242%; height: 0px;"> </td><td rowspan="" style="width: 23.242%; height: 0px;"> </td><td style="width: 23.242%; height: 221.875px;">El desarrollo de PHP 6 ha sido retrasado porque los desarrolladores decidieron que el enfoque actual para tratar cadenas Unicode no es correcto, y están considerando formas alternas para la siguiente versión.<sup class="mw-references reference separada" id="bkmrk--15"></sup> Las mejoras planeadas para PHP 6 fueron añadidas en su lugar en PHP 5.3.0 (Soporte para espacios de nombre, enlace estático en tiempo de ejecución, funciones lambda, clausuras, goto) y 5.4.0 (traits, revinculación de clausura). Se abandonó la versión 6 de PHP siendo la siguiente versión la 7.<sup class="mw-references reference separada" id="bkmrk--16"></sup>​

</td></tr><tr style="height: 53.9062px;"><td class="align-center" style="width: 11.323%; height: 53.9062px;">7.0</td><td class="align-center" style="width: 23.242%; height: 53.9062px;">03-12-2015<sup class="mw-references reference separada" id="bkmrk--17"></sup>​</td><td class="align-center" style="width: 18.7177%; height: 53.9062px;">03-12-2018</td><td style="width: 46.7173%; height: 53.9062px;">Mejoras de rendimiento , <sup class="mw-references reference separada" id="bkmrk--18"></sup>declaración de tipos de retorno en funciones<sup class="mw-references reference separada" id="bkmrk--19"></sup>​</td></tr><tr style="height: 94.8125px;"><td class="align-center" style="width: 11.323%; height: 94.8125px;">7.1</td><td class="align-center" style="width: 23.242%; height: 94.8125px;">01-12-2016<sup class="mw-references reference separada" id="bkmrk--20"></sup>​</td><td class="align-center" style="width: 18.7177%; height: 94.8125px;">01-12-2019</td><td style="width: 46.7173%; height: 94.8125px;">Tipo de retorno vacío, <sup class="mw-references reference separada" id="bkmrk--21"></sup>Clase constante modificadores de visibilidad,<sup class="mw-references reference separada" id="bkmrk--22"></sup> Tipos nullable,<sup class="mw-references reference separada" id="bkmrk--23"></sup> iterable de tipo seudo,<sup class="mw-references reference separada" id="bkmrk--24"></sup> Captura múltiples tipos de excepciones.<sup class="mw-references reference separada" id="bkmrk--25"></sup>​</td></tr><tr style="height: 72.7031px;"><td class="align-center" style="width: 11.323%; height: 72.7031px;">7.2</td><td class="align-center" style="width: 23.242%; height: 72.7031px;">30-11-2017</td><td class="align-center" style="width: 18.7177%; height: 72.7031px;">30-11-2020</td><td style="width: 46.7173%; height: 72.7031px;">Nuevo tipo de retorno «object»,<sup class="mw-references reference separada" id="bkmrk--26"></sup>​ integración de Libsodium como una extensión del núcleo<sup class="mw-references reference separada" id="bkmrk--27"></sup>​</td></tr><tr style="height: 80.1875px;"><td class="align-center" style="width: 11.323%; height: 80.1875px;">7.3</td><td class="align-center" style="width: 23.242%; height: 80.1875px;">6-12-2018</td><td class="align-center" style="width: 18.7177%; height: 80.1875px;">6-12-2021</td><td style="width: 46.7173%; height: 80.1875px;">Sintaxis flexible para Nowdoc y Heredoc, soporte para referencias y deconstrucción de arrays con list(), soporte para PCRE2, función hrtime()</td></tr><tr style="height: 46.5938px;"><td class="align-center" style="width: 11.323%; height: 46.5938px;">7.4</td><td class="align-center" style="width: 23.242%; height: 46.5938px;">28-11-2019</td><td class="align-center" style="width: 18.7177%; height: 46.5938px;">28-11-2022</td><td style="width: 46.7173%; height: 46.5938px;">PHP 7.4 llegó al final de su vida útil el 28 de noviembre de 2022.</td></tr><tr style="height: 46.5938px;"><td class="align-center" style="width: 11.323%; height: 46.5938px;">8.0</td><td class="align-center" style="width: 23.242%; height: 46.5938px;">26-11-2020</td><td class="align-center" style="width: 18.7177%; height: 46.5938px;">26-11-2023</td><td style="width: 46.7173%; height: 46.5938px;">Ingresadas Nuevas características e incremento de rendimiento</td></tr><tr style="height: 46.5938px;"><td class="align-center" style="width: 11.323%; height: 46.5938px;">8.1</td><td class="align-center" style="width: 23.242%; height: 46.5938px;">25-11-2021</td><td class="align-center" style="width: 18.7177%; height: 46.5938px;">25-11-2024</td><td style="width: 46.7173%; height: 46.5938px;">Propiedades «readonly», «enums», «fiber» y nuevas sintaxis</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">8.2</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">08-12-2022</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;">08-12-2025</td><td style="width: 46.7173%; height: 67.0469px;">Creación de propiedades dinámicas esta desaprobada y es agregado el atributo AllowDynamicProperties<sup class="mw-references reference separada" id="bkmrk--28"></sup>​</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">8.3</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">23-11-2023</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;">23-11-2026</td><td style="width: 46.7173%; height: 67.0469px;">Tipado de constantes, atributo override y nuevos métodos para obtener valores aleatorios.<sup class="mw-references reference separada" id="bkmrk--29"></sup>​</td></tr><tr style="height: 67.0469px;"><td class="align-center" style="width: 11.323%; height: 67.0469px;">8.4</td><td class="align-center" style="width: 23.242%; height: 67.0469px;">21-11-2024</td><td class="align-center" style="width: 18.7177%; height: 67.0469px;">31-12-2026</td><td style="width: 46.7173%; height: 67.0469px;">Limpieza de código obsoleto, y nuevas características como hooks y visibilidad asimétrica<sup class="mw-references reference separada" id="bkmrk--30"></sup>​</td></tr><tr style="height: 29.7969px;"><td class="align-center" style="width: 11.323%; height: 29.7969px;">8.5</td><td class="align-center" style="width: 23.242%; height: 29.7969px;">20-11-2025</td><td class="align-center" style="width: 18.7177%; height: 29.7969px;">31-12-2027</td><td style="width: 46.7173%; height: 29.7969px;">  
</td></tr></tbody></table>

[https://es.wikipedia.org/wiki/PHP](https://es.wikipedia.org/wiki/PHP)

# Sintaxi bàsica

La sintaxi de PHP es fonamenta en els principis de programació de C.

L’intèrpret de PHP només executa el codi que es troba entre els seus delimitadors. Els delimitadors més comuns són `<?php` per obrir una secció PHP i `?>` per tancar-la. La finalitat d’aquests delimitadors és separar el codi PHP de la resta de codi, com per exemple l’HTML. En els fitxers que contenen només codi PHP, el delimitador `?>` es pot ometre. De fet, [**PHP-FIG**](https://www.php-fig.org/), a través de les seves recomanacions estàndard per a PHP, recomana ometre el delimitador `?>`, ja que així no s’envia contingut HTML de manera accidental. Per exemple, si s’envia un caràcter «no PHP» (que no és processat per l’intèrpret de PHP), no es podran executar certes accions com enviar capçaleres HTTP mitjançant la funció `header()`, ja que el procés de resposta ja ha començat.

Les variables es prefixen amb el símbol del dòlar (`$`) i no és necessari indicar-ne el tipus. Les variables, a diferència de les funcions, distingeixen entre majúscules i minúscules. Les cadenes de caràcters poden estar encapsulades tant amb cometes dobles com amb cometes simples, encara que en el cas de les primeres, es poden inserir variables directament a la cadena, sense necessitat de concatenació.

Els comentaris es poden escriure bé amb dues barres (`//`) al principi de la línia, o amb un coixinet (`#`). També permet comentaris multilínia encapsulats entre `/* */`.

Quant a les paraules clau, PHP comparteix amb la majoria d’altres llenguatges amb sintaxi C les condicions amb `if`, els bucles amb `for` i `while` i els retorns de funcions. Habitualment, en aquest tipus de llenguatges, les sentències han d’acabar amb punt i coma (`;`).

### PHP dins HTML

```php

<html>

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Exemple bàsic PHP</title>
</head>

<body>
  <?php
    echo 'Hola món';
  ?>
</body>

</html>
```

### Aplicació PHP mónolitica

```php
<?php

// Àrea de capçaleres, constants i includes (inicialització de l’aplicació)
// Capçalera només per a demostració, no és necessària
header('Content-Type: text/html; charset=UTF-8');

$resposta = '';

// Lògica de l’aplicació, com obtenir usuari de la sessió, contingut, etc.
// Aquest codi podria venir d’una plantilla externa per a una fàcil reutilització
$resposta .= '';
$resposta .= '<html lang="ca">';
$resposta .= '';
$resposta .= '<head>';
$resposta .= '  <meta charset="UTF-8" />';
$resposta .= '  <meta name="viewport" content="width=device-width, initial-scale=1.0" />';
$resposta .= '  <title>Exemple bàsic de PHP</title>';
$resposta .= '</head>';
$resposta .= '';
$resposta .= '<body>';
$resposta .= '  <h1>Hola món!</h1>';
$resposta .= '</body>';
$resposta .= '';
$resposta .= '</html>';

// Envia resposta
echo $resposta;

// No es tanca l’"etiqueta" <?php. PHP-FIG recomana aquesta pràctica en
// fitxers que contenen només codi PHP per tal de no enviar contingut HTML de
// manera accidental.
```

</body></html>

# Els comentaris

En **PHP**, els comentaris serveixen per afegir notes o explicacions dins del codi que **no són executades** per l’intèrpret. Són útils per documentar què fa un fragment de codi, recordar idees o facilitar la lectura a altres programadors.

### Comentaris d’una sola línia

Amb **doble barra** `//`

```php
// Això és un comentari d’una sola línia
$nom = "Maria"; // També es pot posar després d’una instrucció
```

També pot ser amb `#`

```php
# També és un comentari d’una sola línia
```

### Comentaris multilínia

Amb `/* ... */` s'inicia el comentari amb el símbol `/*` i es finalitza el bloc de comentari amb `*/`

```php
/* 
  Aquest és un comentari
  que ocupa més d’una línia
*/
```

# PHP Info

La funció **`phpinfo()`** és una de les més conegudes de PHP i s’utilitza principalment per a **mostrar informació detallada de la configuració del sistema i del propi PHP**.

Quan s’executa dins d’un script, genera una pàgina HTML amb dades com:

- La **versió de PHP** que s’està executant.
- Les **extensions carregades** i les seves configuracions (com MySQLi, GD, cURL, etc.).
- Els **valors de les directives del php.ini** (com `upload_max_filesize`, `memory_limit`, `display_errors`, etc.).
- Informació del **servidor web** (per exemple, Apache o Nginx).
- El **sistema operatiu** sobre el qual corre PHP.
- Variables d’entorn i de servidor.

Un exemple bàsic seria:

```php
<?php 
  phpinfo();
```

Aquest codi en un fitxer (per exemple, `info.php`), si s’executa des del navegador, ens mostrarà una pàgina amb tota la informació del entorn PHP on s'està executant.

<p class="callout warning">**Important:**  
Per motius de **seguretat**, no és recomanable deixar aquest fitxer accessible en un servidor públic, ja que mostra dades sensibles que poden ser útils per a un atacant (com configuracions internes del sistema).</p>

# Mostrar informació

En **PHP** tenim diverses formes senzilles de **mostrar informació per pantalla** (sobretot en aplicacions web).

#### echo

És la més comuna i ràpida, en ella podem posar més d'una cadena de text si és precis. Així mateix funciona diferent si el string que es passa com a paràmetre està entre `"` o està entre `'`

```php
echo "Hola món!";         
echo "Nom: ", " Maria";
```

En PHP, **`<?= ... ?>`** és una **forma abreujada d’escriure `<?php echo ... ?>`**, és a dir, serveix per mostrar directament el valor d’una expressió per pantalla.

```php
<?php
$nom = "Maria";
?>
<p>Hola, <?= $nom ?>!</p>
```

seria equivalent a,

```php
<?php
$nom = "Maria";
?>
<p>Hola, <?php echo $nom; ?>!</p>
```

#### print

És igual que un echo pero només accepta una expressió i retorna 1

```php
print "Hola món!";
```

#### print\_r()

Aquesta instrucció és un print recursiu, que ens permet mostrar el contingut de variables complexes, ja siguin arrays, arrays multidimensionals, objectes, etc..

```php
$fruites = ["poma", "pera", "plàtan"];
print_r($fruites);
```

#### var\_dump()

Mostra informació detallada sobre una variable: tipus, longitud i valor

```php
$edat = 25;
var_dump($edat);
```

### die() o exit()

La instrucció die en PHP té una funcionalitat molt clara i senzilla: Atura immediatament l’execució del programa. Si no té paràmetres, només atura l'execució del script i si rep un missatge o variable com a paràmetre, el mostra per pantalla i després acaba l’execució. Resulta una funció molt útil per gestionar errors (per exemple, quan falla una connexió a la base de dades) o per depurar mostrant informació i parant el codi en aquell punt.

```php
<?php

// Aturar l'execució d'un programa
echo "Abans de die.";
die();
echo "Això no s’executarà.";


// Mostrar informació abans d'aturar-se
$missatge = "Error: connexió fallida a la base de dades.";
die($missatge);


// Utilització com a mecanisme de depuració o informació
$usuari = ["nom" => "Maria", "edat" => 30];
die(print_r($usuari, true));
```

# Variables

Les variables en PHP ens serveixen per emmagatzemar dades i que poden canviar durant l'execució del programa.

### Característiques

- **Sempre comencen amb el símbol del dòlar** `$`, seguit d'un nom que pot contenir lletres, números i guions baixos.
- PHP és un llenguatge **case-sensitive**
- **Variables no tipades**. PHP assigna dinàmicament l'espai en funció del valor

```php
// String. Cadena de caràcters o text
$fruita = "poma";

// Integer. Nombres enters
$edat = 30;

// Float/Double. Nombres decimals
$preu = 19.99;

// Boolean. Pot ser true o false
$actiu = true;

// Array. Llistes de valors de qualsevol tipus
$colors = ["vermell", "verd", "blau"];

// Objectes. Instàncies a classes
$persona = new Persona();

// NULL. Variable sense valor assignat
$resposta = null;

```

- Les variables **poden canviar** de valor **en qualsevol moment**

```php
// Les variables poden canviar en valor
// i fins i tot de tipus
$var = "Joan";
$var = 23;
```

- Si utilitzem cometes dobles en els string, podem inserir variables directament (**interpolació**)

```php
$nom = "Joan";
echo "Hola, $nom"; // Mostra: Hola, Joan
```

amb cometes simples, s'imprimeix literalment i no s'interpreten les variables

```php
echo 'Hola, $nom'; // Mostra: Hola, $nom
```

### Recomanacions  


- Nomenclatura: 
    - Noms descriptius, en minuscules amb guions baixos per separar paraules `<strong>$nom_variable</strong>` (**snake case**)
    - Noms descriptius, `<strong>$nomVariable</strong>`, separant les paraules amb la primera lletra majuscula (**camel case**)
    - Noms descriptius, `<strong>$sNomVariable</strong>`, la primera lletra indica el tipus de la variable i segueix el nom de la variable en camel case (**Hungarian Case**)
- Inicialitzar les variables abans d'utilitzar-les
- Evitar variables globals si no són necessàries, utilitzar funcions i arrays per encapsular dades

#### Snake case

```php
$nom_usuari = "Joan";
$edat_usuari = 25;
```

#### Camel case

```php
$nomUsuari = "Joan";
$edatUsuari = 25;
```

#### Hungarian case

```php
$strNom = "Joan";   // str = string
$intEdat = 25;      // int = integer
$arrFruites = ["poma","pera"]; // arr = array
```

#### Exemple

```php
<?php
// ----------------------------
// 1. Snake case
// Les paraules es separen amb guions baixos
$nom_usuari = "Joan";
$edat_usuari = 25;
$correu_usuari = "joan@example.com";

echo "Snake case: $nom_usuari té $edat_usuari anys i el correu és $correu_usuari.<br>";

// ----------------------------
// 2. Camel case
// La primera paraula en minúscula, les següents amb majúscula
$nomUsuari = "Maria";
$edatUsuari = 30;
$correuUsuari = "maria@example.com";

echo "Camel case: $nomUsuari té $edatUsuari anys i el correu és $correuUsuari.<br>";

// ----------------------------
// 3. Hungarian case
// Prefix que indica el tipus de dada
$strNom = "Pere";       // string
$intEdat = 40;          // integer
$strCorreu = "pere@example.com"; // string

echo "Hungarian case: $strNom té $intEdat anys i el correu és $strCorreu.<br>";
```

- **Snake case:** llegible, molt utilitzat en PHP clàssic.
- **Camel case:** modern, habitual en frameworks i codi orientat a objectes.
- **Hungarian case:** mostra el tipus de dada, útil per depuració, menys usat avui dia.

### Operacions bàsiques

#### Assignació

```php
<?php
$nom = "Joan";
$edat = 25;
```

#### Aritmètiques

```php
<?php
$a = 10;
$b = 3;

$suma = $a + $b;         // 13
$resta = $a - $b;        // 7
$producte = $a * $b;     // 30
$divisio = $a / $b;      // 3.333...
$modul = $a % $b;        // 1 (residu)
$potencia = $a ** $b;    // 1000
```

#### Operacions amb `strings`

```php
<?php
// Concatenació
$nom = "Maria";
$missatge = "Hola " . $nom . "!"; // "Hola Maria!"

// Interpolació
$missatge = "Hola $nom!"; // "Hola Maria!"

// Interpolació NOMES AMB "
$missatge = 'Hola $nom'; // "Hola $nom"

```

#### Operacions assignació composta

```php
<?php
$x = 5;
$x += 3;  // $x = $x + 3 = 5 + 3 = 8
$x -= 2;  // $x = 8 - 2 = 6
$x *= 4;  // $x = 6 * 4 = 24
$x /= 6;  // $x = 24 / 4 = 6

$str = 'hola ';
$str .= 'mon'; // $str = $str . 'mon' = 'hola ' . 'mon' = 'hola mon'
```

#### Increment i decrement

```php
<?php
$comptador = 1;
$comptador++; // 2 (incrementa en 1)
$comptador--; // 1 (disminueix en 1)  
```

# Spread operator (Arrays)

El **Operador Spread** (o **Operador de Desplegament**), representat per tres punts consecutius (`...`), és una característica d'una gran potència en PHP que permet expandir o "desplegar" un objecte iterable (normalment una matriu o un objecte `Traversable`) en els seus elements individuals.

A PHP, s'utilitza principalment en dos contextos diferents:

<div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-en-crides-de-funcion" inline-copy-host="">1. **En crides de funcions/mètodes** (Argument Unpacking, introduït a **PHP 5.6**).
2. **En definicions de matriu** (Array Unpacking, introduït a **PHP 7.4**).

</div>## Argument Unpacking

Aquesta funcionalitat permet passar tots els elements d'una matriu com a **arguments separats** a una funció o mètode. És l'alternativa moderna a la funció obsoleta `call_user_func_array()`.

### Com Funciona?

Quan es col·loca l'operador Spread (`...`) davant d'una matriu en una crida a una funció, PHP tracta cada element de la matriu com un argument individual.

Imaginem que tenim una funció que suma tres nombres:

<div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-245 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1709322443-245 ng-star-inserted"><span class="ng-tns-c1709322443-245">PHP</span><div _ngcontent-ng-c1709322443="" class="buttons ng-tns-c1709322443-245 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1709322443-245 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-245"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-245"></div></div></div>```php
<?php
// Funció que requereix tres arguments separats
function sumar_tres_numeros(int $a, int $b, int $c): int {
    return $a + $b + $c;
}

// Matriu amb els valors que volem utilitzar
$arguments = [10, 20, 30];

// Ús de l'Operador Spread:
// La matriu $arguments es desplega a: sumar_tres_numeros(10, 20, 30)
$resultat = sumar_tres_numeros(...$arguments);

echo "El resultat de la suma és: " . $resultat; // Sortida: 60
?>

```

<div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-245 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-245"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-245"></div></div></div>## Array Unpacking / Merging

Aquesta funcionalitat permet inserir tots els elements d'una matriu dins d'una altra matriu. És una manera molt concisa de fusionar matrius.

### Com Funciona?

L'operador Spread es col·loca dins de la sintaxi de definició d'una matriu (`[]`) per extreure els elements d'una matriu existent i afegir-los a la nova.

<div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div><div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-246 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1709322443-246 ng-star-inserted"><span class="ng-tns-c1709322443-246">PHP</span><div _ngcontent-ng-c1709322443="" class="buttons ng-tns-c1709322443-246 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1709322443-246 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-246"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-246"></div></div></div>```php
<?php
$fruites = ['poma', 'plàtan'];
$verdures = ['pastanaga', 'enciam'];

// Creació d'una nova matriu fusionant $fruites i $verdures
$cistella = [
    'pa',        // Element normal
    ...$fruites,   // Desplega els elements de $fruites
    'aigua',     // Element normal
    ...$verdures   // Desplega els elements de $verdures
];

print_r($cistella);
/*
Sortida:
Array
(
    [0] => pa
    [1] => poma
    [2] => plàtan
    [3] => aigua
    [4] => pastanaga
    [5] => enciam
)
*/
?>
```

<div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-246 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-246"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-246"></div></div></div><div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--4" inline-copy-host=""></div>### Casos avançats: Regles importants

<div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-cas-d%27%C3%9As-explicaci%C3%B3-" inline-copy-host=""><table data-path-to-node="19" style="width: 100%;"><thead><tr><td style="width: 27.9939%;">**Cas d'Ús**</td><td style="width: 44.7117%;">**Explicació**</td><td style="width: 27.2944%;">**Codi d'Exemple**</td></tr></thead><tbody><tr><td data-path-to-node="19,1,0,0" style="width: 27.9939%;">**Matrius Indexades**</td><td data-path-to-node="19,1,1,0" style="width: 44.7117%;">Si les dues matrius són numèriques (indexades), es fusionen sense problemes i la numeració dels índexs es reinicia.</td><td data-path-to-node="19,1,2,0" style="width: 27.2944%;">`['a', ...['b', 'c'], 'd']` -&gt; `['a', 'b', 'c', 'd']`</td></tr><tr><td data-path-to-node="19,2,0,0" style="width: 27.9939%;">**Matrius Associatives (PHP 8.1+)**</td><td data-path-to-node="19,2,1,0" style="width: 44.7117%;">A partir de PHP 8.1, l'operador Spread es pot utilitzar amb **matrius associatives**. Les claus repetides de la matriu desplegada **sobreescriuen** la clau anterior.</td><td data-path-to-node="19,2,2,0" style="width: 27.2944%;">`['a' => 1, ...['b' => 2, 'a' => 3]]` -&gt; `['a' => 3, 'b' => 2]`</td></tr><tr><td data-path-to-node="19,3,0,0" style="width: 27.9939%;">**Alternativa a `array_merge()`**</td><td data-path-to-node="19,3,1,0" style="width: 44.7117%;">El Spread Operator és generalment més ràpid que la funció `array_merge()` per a la fusió de matrius simples.</td><td data-path-to-node="19,3,2,0" style="width: 27.2944%;">`[...$arr1, ...$arr2]`</td></tr></tbody></table>

</div>## Desplegament en la definició de funcions (Argument Packing / Variadic Functions)

Tot i que tècnicament no és el mateix concepte d'operador Spread, la sintaxi `...` també s'utilitza en la definició de funcions per capturar un **nombre il·limitat d'arguments** en una única matriu. Això es coneix com a **Argument Packing** (Funcions Variàdiques).

<div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div><div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-247 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1709322443-247 ng-star-inserted"><span class="ng-tns-c1709322443-247">PHP</span><div _ngcontent-ng-c1709322443="" class="buttons ng-tns-c1709322443-247 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1709322443-247 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-247"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-247"></div></div></div>```php
<?php
// Ús de ...$nums per capturar tots els arguments restants
function sumar_qualsevol_quantitat(...$nums): int {
    $total = 0;
    foreach ($nums as $num) {
        $total += $num;
    }
    return $total;
}

// Podem passar 2, 5 o 100 arguments
echo sumar_qualsevol_quantitat(1, 2, 3, 4); // Sortida: 10
?>
```

<div _ngcontent-ng-c1709322443="" class="code-block ng-tns-c1709322443-247 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--6" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_45c5dc5113cf8d44","c_7b2cc0aa5e1860b3",null,"rc_0c1c786d3c2301c0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c1709322443="" class="formatted-code-block-internal-container ng-tns-c1709322443-247"><div _ngcontent-ng-c1709322443="" class="animated-opacity ng-tns-c1709322443-247"></div></div></div><div _ngcontent-ng-c2346515136="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div>