CINXE.COM
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"> <head profile="http://gmpg.org/xfn/11"> <script> !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey="RD2qX3qoOmSoOPkIDnEUxm9iMuT2Mhxd";;analytics.SNIPPET_VERSION="4.15.3"; analytics.load("RD2qX3qoOmSoOPkIDnEUxm9iMuT2Mhxd"); analytics.page(); }}(); </script> <meta name="google-site-verification" content="gPNSsOlshQz1S1k1aHG6NcIQpTjpujV95Gnt-BvWEp4"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta name="viewport" content="initial-scale=1, maximum-scale=1"> <title></title> <link rel="shortcut icon" href="/wp-content/themes/phpa/favicon.ico"/> <link rel="preload" as="image" href="/wp-content/themes/phpa/images/header/backgrounds/sm/3.jpg" /> <meta name='robots' content='max-image-preview:large' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <link rel='dns-prefetch' href='//cdn-images.mailchimp.com' /> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.7.2"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <style id='wp-emoji-styles-inline-css' type='text/css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link rel='stylesheet' id='wp-block-library-css' href='/wp-includes/css/dist/block-library/style.min.css?ver=6.7.2' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css' type='text/css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='mc-horiz-css' href='https://cdn-images.mailchimp.com/embedcode/horizontal-slim-10_7.css?ver=v=150' type='text/css' media='all' /> <link rel='stylesheet' id='phpa-redmond-css' href='/wp-content/themes/phpa/js/css/redmond/jquery-ui.css?ver=v=150' type='text/css' media='all' /> <link rel='stylesheet' id='phpa-style-css' href='/wp-content/themes/phpa/style.css?ver=v=150' type='text/css' media='all' /> <link rel='stylesheet' id='phpa-prism-css' href='/wp-content/themes/phpa/js/prism/prism.css?ver=v=150' type='text/css' media='all' /> <script type="text/javascript" src="/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script> <script type="text/javascript" src="/wp-content/plugins/inferno-login/templates/js/login.js?ver=1" id="inferno_login-js"></script> <script type="text/javascript" src="/wp-content/plugins/simple-content-experiments/simple-content-experiments.js?ver=6.7.2" id="simple_content_experiments-js"></script> <link rel="https://api.w.org/" href="https://www.phparch.com/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.phparch.com/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress 6.7.2" /> <!-- FB Sharing info --> <meta property="og:site_name" content="PHP Architect" /> <meta property="og:description" content="The site for PHP professionals, Magazine, Training, Books, Conferences" /> <meta property="og:type" content="website" /> <meta property="og:image" content="/wp-content/uploads/2016/03/logo_orange-150x150.png" /> <meta name="description" content="The site for PHP professionals, Magazine, Training, Books, Conferences" /> <script type="text/javascript"><!-- function powerpress_pinw(pinw_url){window.open(pinw_url, 'PowerPressPlayer','toolbar=0,status=0,resizable=1,width=460,height=320'); return false;} //--> // tabnab protection window.addEventListener('load', function () { // make all links have rel="noopener noreferrer" document.querySelectorAll('a[target="_blank"]').forEach(link => { link.setAttribute('rel', 'noopener noreferrer'); }); }); </script> <!-- JavaScript init for Simple Content Experiments plugin: --> <script> // Object.keys polyfill for IE8 and below if (!Object.keys) Object.keys = function(o) { if (o !== Object(o)) throw new TypeError("Object.keys called on a non-object"); var k=[],p; for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); return k; } var simple_content_experiements_debug = false; </script><link rel="icon" href="/wp-content/uploads/2023/09/cropped-favicon-512x512-1-32x32.png" sizes="32x32" /> <link rel="icon" href="/wp-content/uploads/2023/09/cropped-favicon-512x512-1-192x192.png" sizes="192x192" /> <link rel="apple-touch-icon" href="/wp-content/uploads/2023/09/cropped-favicon-512x512-1-180x180.png" /> <meta name="msapplication-TileImage" content="/wp-content/uploads/2023/09/cropped-favicon-512x512-1-270x270.png" /> <style type="text/css" id="wp-custom-css"> .image-with-padding { padding: 20px; border-radius: 10px; overflow: hidden; } .scrollable-code-box { width: 100%; max-height: 400px; /* Adjust the height as needed */ overflow-y: scroll; border: 1px solid #ccc; padding: 10px; background-color: #f4f4f4; font-family: monospace; white-space: pre-wrap; /* Ensures long lines of code wrap */ word-wrap: break-word; } </style> <link rel="pingback" href="https://www.phparch.com/xmlrpc.php"/> <link rel="alternate" type="application/rss+xml" title="PHP Architect RSS Feed" href="https://www.phparch.com/feed/"/> <link rel='archives' title='March 2025' href='https://www.phparch.com/2025/03/' /> <link rel='archives' title='February 2025' href='https://www.phparch.com/2025/02/' /> <link rel='archives' title='January 2025' href='https://www.phparch.com/2025/01/' /> <link rel='archives' title='December 2024' href='https://www.phparch.com/2024/12/' /> <link rel='archives' title='October 2024' href='https://www.phparch.com/2024/10/' /> <link rel='archives' title='September 2024' href='https://www.phparch.com/2024/09/' /> <link rel='archives' title='August 2024' href='https://www.phparch.com/2024/08/' /> <link rel='archives' title='July 2024' href='https://www.phparch.com/2024/07/' /> <link rel='archives' title='June 2024' href='https://www.phparch.com/2024/06/' /> <link rel='archives' title='May 2024' href='https://www.phparch.com/2024/05/' /> <link rel='archives' title='February 2024' href='https://www.phparch.com/2024/02/' /> <link rel='archives' title='January 2024' href='https://www.phparch.com/2024/01/' /> <link rel='archives' title='October 2023' href='https://www.phparch.com/2023/10/' /> <link rel='archives' title='September 2023' href='https://www.phparch.com/2023/09/' /> <link rel='archives' title='August 2023' href='https://www.phparch.com/2023/08/' /> <link rel='archives' title='June 2023' href='https://www.phparch.com/2023/06/' /> <link rel='archives' title='May 2023' href='https://www.phparch.com/2023/05/' /> <link rel='archives' title='April 2023' href='https://www.phparch.com/2023/04/' /> <link rel='archives' title='March 2023' href='https://www.phparch.com/2023/03/' /> <link rel='archives' title='February 2023' href='https://www.phparch.com/2023/02/' /> <link rel='archives' title='January 2023' href='https://www.phparch.com/2023/01/' /> <link rel='archives' title='December 2022' href='https://www.phparch.com/2022/12/' /> <link rel='archives' title='November 2022' href='https://www.phparch.com/2022/11/' /> <link rel='archives' title='October 2022' href='https://www.phparch.com/2022/10/' /> <link rel='archives' title='September 2022' href='https://www.phparch.com/2022/09/' /> <link rel='archives' title='September 2021' href='https://www.phparch.com/2021/09/' /> <link rel='archives' title='August 2021' href='https://www.phparch.com/2021/08/' /> <link rel='archives' title='July 2021' href='https://www.phparch.com/2021/07/' /> <link rel='archives' title='June 2021' href='https://www.phparch.com/2021/06/' /> <link rel='archives' title='May 2021' href='https://www.phparch.com/2021/05/' /> <link rel='archives' title='April 2021' href='https://www.phparch.com/2021/04/' /> <link rel='archives' title='March 2021' href='https://www.phparch.com/2021/03/' /> <link rel='archives' title='December 2020' href='https://www.phparch.com/2020/12/' /> <link rel='archives' title='November 2020' href='https://www.phparch.com/2020/11/' /> <link rel='archives' title='October 2020' href='https://www.phparch.com/2020/10/' /> <link rel='archives' title='September 2020' href='https://www.phparch.com/2020/09/' /> <link rel='archives' title='August 2020' href='https://www.phparch.com/2020/08/' /> <link rel='archives' title='July 2020' href='https://www.phparch.com/2020/07/' /> <link rel='archives' title='March 2020' href='https://www.phparch.com/2020/03/' /> <link rel='archives' title='February 2020' href='https://www.phparch.com/2020/02/' /> <link rel='archives' title='December 2019' href='https://www.phparch.com/2019/12/' /> <link rel='archives' title='November 2019' href='https://www.phparch.com/2019/11/' /> <link rel='archives' title='September 2019' href='https://www.phparch.com/2019/09/' /> <link rel='archives' title='August 2019' href='https://www.phparch.com/2019/08/' /> <link rel='archives' title='June 2019' href='https://www.phparch.com/2019/06/' /> <link rel='archives' title='May 2019' href='https://www.phparch.com/2019/05/' /> <link rel='archives' title='April 2019' href='https://www.phparch.com/2019/04/' /> <link rel='archives' title='March 2019' href='https://www.phparch.com/2019/03/' /> <link rel='archives' title='February 2019' href='https://www.phparch.com/2019/02/' /> <link rel='archives' title='January 2019' href='https://www.phparch.com/2019/01/' /> <link rel='archives' title='December 2018' href='https://www.phparch.com/2018/12/' /> <link rel='archives' title='November 2018' href='https://www.phparch.com/2018/11/' /> <link rel='archives' title='October 2018' href='https://www.phparch.com/2018/10/' /> <link rel='archives' title='September 2018' href='https://www.phparch.com/2018/09/' /> <link rel='archives' title='August 2018' href='https://www.phparch.com/2018/08/' /> <link rel='archives' title='July 2018' href='https://www.phparch.com/2018/07/' /> <link rel='archives' title='June 2018' href='https://www.phparch.com/2018/06/' /> <link rel='archives' title='May 2018' href='https://www.phparch.com/2018/05/' /> <link rel='archives' title='April 2018' href='https://www.phparch.com/2018/04/' /> <link rel='archives' title='March 2018' href='https://www.phparch.com/2018/03/' /> <link rel='archives' title='February 2018' href='https://www.phparch.com/2018/02/' /> <link rel='archives' title='January 2018' href='https://www.phparch.com/2018/01/' /> <link rel='archives' title='December 2017' href='https://www.phparch.com/2017/12/' /> <link rel='archives' title='November 2017' href='https://www.phparch.com/2017/11/' /> <link rel='archives' title='October 2017' href='https://www.phparch.com/2017/10/' /> <link rel='archives' title='September 2017' href='https://www.phparch.com/2017/09/' /> <link rel='archives' title='August 2017' href='https://www.phparch.com/2017/08/' /> <link rel='archives' title='July 2017' href='https://www.phparch.com/2017/07/' /> <link rel='archives' title='June 2017' href='https://www.phparch.com/2017/06/' /> <link rel='archives' title='May 2017' href='https://www.phparch.com/2017/05/' /> <link rel='archives' title='April 2017' href='https://www.phparch.com/2017/04/' /> <link rel='archives' title='March 2017' href='https://www.phparch.com/2017/03/' /> <link rel='archives' title='January 2017' href='https://www.phparch.com/2017/01/' /> <link rel='archives' title='December 2016' href='https://www.phparch.com/2016/12/' /> <link rel='archives' title='November 2016' href='https://www.phparch.com/2016/11/' /> <link rel='archives' title='October 2016' href='https://www.phparch.com/2016/10/' /> <link rel='archives' title='September 2016' href='https://www.phparch.com/2016/09/' /> <link rel='archives' title='August 2016' href='https://www.phparch.com/2016/08/' /> <link rel='archives' title='July 2016' href='https://www.phparch.com/2016/07/' /> <link rel='archives' title='June 2016' href='https://www.phparch.com/2016/06/' /> <link rel='archives' title='May 2016' href='https://www.phparch.com/2016/05/' /> <link rel='archives' title='April 2016' href='https://www.phparch.com/2016/04/' /> <link rel='archives' title='March 2016' href='https://www.phparch.com/2016/03/' /> <link rel='archives' title='February 2016' href='https://www.phparch.com/2016/02/' /> <link rel='archives' title='January 2016' href='https://www.phparch.com/2016/01/' /> <link rel='archives' title='December 2015' href='https://www.phparch.com/2015/12/' /> <link rel='archives' title='November 2015' href='https://www.phparch.com/2015/11/' /> <link rel='archives' title='October 2015' href='https://www.phparch.com/2015/10/' /> <link rel='archives' title='September 2015' href='https://www.phparch.com/2015/09/' /> <link rel='archives' title='August 2015' href='https://www.phparch.com/2015/08/' /> <link rel='archives' title='July 2015' href='https://www.phparch.com/2015/07/' /> <link rel='archives' title='June 2015' href='https://www.phparch.com/2015/06/' /> <link rel='archives' title='May 2015' href='https://www.phparch.com/2015/05/' /> <link rel='archives' title='April 2015' href='https://www.phparch.com/2015/04/' /> <link rel='archives' title='March 2015' href='https://www.phparch.com/2015/03/' /> <link rel='archives' title='February 2015' href='https://www.phparch.com/2015/02/' /> <link rel='archives' title='January 2015' href='https://www.phparch.com/2015/01/' /> <link rel='archives' title='December 2014' href='https://www.phparch.com/2014/12/' /> <link rel='archives' title='November 2014' href='https://www.phparch.com/2014/11/' /> <link rel='archives' title='October 2014' href='https://www.phparch.com/2014/10/' /> <link rel='archives' title='September 2014' href='https://www.phparch.com/2014/09/' /> <link rel='archives' title='August 2014' href='https://www.phparch.com/2014/08/' /> <link rel='archives' title='July 2014' href='https://www.phparch.com/2014/07/' /> <link rel='archives' title='June 2014' href='https://www.phparch.com/2014/06/' /> <link rel='archives' title='May 2014' href='https://www.phparch.com/2014/05/' /> <link rel='archives' title='April 2014' href='https://www.phparch.com/2014/04/' /> <link rel='archives' title='March 2014' href='https://www.phparch.com/2014/03/' /> <link rel='archives' title='February 2014' href='https://www.phparch.com/2014/02/' /> <link rel='archives' title='January 2014' href='https://www.phparch.com/2014/01/' /> <link rel='archives' title='December 2013' href='https://www.phparch.com/2013/12/' /> <link rel='archives' title='November 2013' href='https://www.phparch.com/2013/11/' /> <link rel='archives' title='October 2013' href='https://www.phparch.com/2013/10/' /> <link rel='archives' title='September 2013' href='https://www.phparch.com/2013/09/' /> <link rel='archives' title='August 2013' href='https://www.phparch.com/2013/08/' /> <link rel='archives' title='July 2013' href='https://www.phparch.com/2013/07/' /> <link rel='archives' title='June 2013' href='https://www.phparch.com/2013/06/' /> <link rel='archives' title='April 2013' href='https://www.phparch.com/2013/04/' /> <link rel='archives' title='February 2013' href='https://www.phparch.com/2013/02/' /> <link rel='archives' title='January 2013' href='https://www.phparch.com/2013/01/' /> <link rel='archives' title='December 2012' href='https://www.phparch.com/2012/12/' /> <link rel='archives' title='August 2012' href='https://www.phparch.com/2012/08/' /> <link rel='archives' title='June 2012' href='https://www.phparch.com/2012/06/' /> <link rel='archives' title='April 2012' href='https://www.phparch.com/2012/04/' /> <link rel='archives' title='March 2012' href='https://www.phparch.com/2012/03/' /> <link rel='archives' title='February 2012' href='https://www.phparch.com/2012/02/' /> <link rel='archives' title='January 2012' href='https://www.phparch.com/2012/01/' /> <link rel='archives' title='December 2011' href='https://www.phparch.com/2011/12/' /> <link rel='archives' title='November 2011' href='https://www.phparch.com/2011/11/' /> <link rel='archives' title='October 2011' href='https://www.phparch.com/2011/10/' /> <link rel='archives' title='September 2011' href='https://www.phparch.com/2011/09/' /> <link rel='archives' title='June 2011' href='https://www.phparch.com/2011/06/' /> <link rel='archives' title='May 2011' href='https://www.phparch.com/2011/05/' /> <link rel='archives' title='April 2011' href='https://www.phparch.com/2011/04/' /> <link rel='archives' title='March 2011' href='https://www.phparch.com/2011/03/' /> <link rel='archives' title='February 2011' href='https://www.phparch.com/2011/02/' /> <link rel='archives' title='January 2011' href='https://www.phparch.com/2011/01/' /> <link rel='archives' title='December 2010' href='https://www.phparch.com/2010/12/' /> <link rel='archives' title='November 2010' href='https://www.phparch.com/2010/11/' /> <link rel='archives' title='October 2010' href='https://www.phparch.com/2010/10/' /> <link rel='archives' title='September 2010' href='https://www.phparch.com/2010/09/' /> <link rel='archives' title='August 2010' href='https://www.phparch.com/2010/08/' /> <link rel='archives' title='July 2010' href='https://www.phparch.com/2010/07/' /> <link rel='archives' title='June 2010' href='https://www.phparch.com/2010/06/' /> <link rel='archives' title='May 2010' href='https://www.phparch.com/2010/05/' /> <link rel='archives' title='April 2010' href='https://www.phparch.com/2010/04/' /> <link rel='archives' title='March 2010' href='https://www.phparch.com/2010/03/' /> <link rel='archives' title='February 2010' href='https://www.phparch.com/2010/02/' /> <link rel='archives' title='January 2010' href='https://www.phparch.com/2010/01/' /> <link rel='archives' title='November 2009' href='https://www.phparch.com/2009/11/' /> <link rel='archives' title='October 2009' href='https://www.phparch.com/2009/10/' /> <link rel='archives' title='September 2009' href='https://www.phparch.com/2009/09/' /> <link rel='archives' title='August 2009' href='https://www.phparch.com/2009/08/' /> <link rel='archives' title='July 2009' href='https://www.phparch.com/2009/07/' /> <link rel='archives' title='June 2009' href='https://www.phparch.com/2009/06/' /> <link rel='archives' title='May 2009' href='https://www.phparch.com/2009/05/' /> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5KQ8W6CS');</script> <!-- End Google Tag Manager --> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5KQ8W6CS" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <!-- Service Bar --> <div class="bar service-bar clearfix"> <div class="bar-interior"> <h1><a href="/" alt="PHP Architect Home" class="navHome"><img src="/wp-content/themes/phpa/images/new_logo_mark_nav.png" alt="PHP Architect logo"></a></h1> <div class="menu-handle"><img src="/wp-content/themes/phpa/images/handle.png"></div> <nav class="menu"> <div class="menu-topmenu-container"><ul id="menu-topmenu" class="menu"><li id="menu-item-10824" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10824"><a href="https://www.phparch.com/magazine/">Magazine</a> <ul class="sub-menu"> <li id="menu-item-10822" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10822"><a href="https://www.phparch.com/magazine/subscribe/">Subscribe</a></li> <li id="menu-item-10819" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10819"><a href="https://www.phparch.com/magazine/advertise/">Advertise with Us</a></li> <li id="menu-item-17835" class="menu-item-17835"><a href="https://www.phparch.com/magazine/2025/03/2025-03-transforming-php/">Transforming PHP – March 2025</a></li> <li id="menu-item-17695" class="menu-item-17695"><a href="https://www.phparch.com/magazine/2025/02/2025-02-yelling-at-clouds/">Yelling at Clouds – February 2025</a></li> <li id="menu-item-17595" class="menu-item-17595"><a href="https://www.phparch.com/magazine/2025/01/2025-01-cranking-phpstan-to-10/">Cranking PHPStan to 10 – January 2025</a></li> <li id="menu-item-17515" class="menu-item-17515"><a href="https://www.phparch.com/magazine/2024/12/2024-12-time-for-php/">Time For PHP – December 2024</a></li> <li id="menu-item-16946" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16946"><a href="https://www.phparch.com/magazine/2024-2/">Past Issues</a></li> <li id="menu-item-10818" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10818"><a href="https://www.phparch.com/editorial/write-for-us/">Write for Us</a></li> <li id="menu-item-10823" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10823"><a href="https://www.phparch.com/editorial/write-for-us/editorial-guidelines/">Editorial Guidelines</a></li> </ul> </li> <li id="menu-item-10836" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10836"><a href="https://www.phparch.com/books/">Books</a> <ul class="sub-menu"> <li id="menu-item-10847" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10847"><a href="/books">All Books</a></li> <li id="menu-item-10835" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10835"><a href="https://www.phparch.com/editorial/write-for-us/book-guidelines/">Write for Us</a></li> <li id="menu-item-17817" class="menu-item-17817"><a href="https://www.phparch.com/books/jacked-php/">Jacked PHP</a></li> <li id="menu-item-15262" class="menu-item-15262"><a href="https://www.phparch.com/books/the-complementary-php-testing-tools-cookbook/">The Complementary PHP Testing Tools Cookbook</a></li> <li id="menu-item-15047" class="menu-item-15047"><a href="https://www.phparch.com/books/php-web-development-with-mysql/">PHP Web Development with MySQL</a></li> <li id="menu-item-14713" class="menu-item-14713"><a href="https://www.phparch.com/books/beyond-laravel/">Beyond Laravel</a></li> <li id="menu-item-14607" class="menu-item-14607"><a href="https://www.phparch.com/books/php-development-with-windows-subsystem-for-linux-wsl/">PHP Development with Windows Subsystem for Linux (WSL)</a></li> <li id="menu-item-14278" class="menu-item-14278"><a href="https://www.phparch.com/books/wordpress-development-in-depth/">WordPress Development in Depth</a></li> <li id="menu-item-13975" class="menu-item-13975"><a href="https://www.phparch.com/books/the-grumpy-programmers-guide-to-testing-php-applications/">The Grumpy Programmer’s Guide To Testing PHP Applications</a></li> <li id="menu-item-14025" class="menu-item-14025"><a href="https://www.phparch.com/books/the-fizz-buzz-fix/">The Fizz Buzz Fix</a></li> </ul> </li> <li id="menu-item-10825" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10825"><a href="https://www.phparch.com/swag/">Swag</a> <ul class="sub-menu"> <li id="menu-item-15684" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15684"><a href="https://www.phparch.com/swag/plush-elephpant/">PHP Architect ElePHPant</a></li> <li id="menu-item-10826" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10826"><a href="https://www.phparch.com/swag/laravel-plush-elephpant/">Laravel ElePHPant</a></li> <li id="menu-item-10883" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10883"><a href="https://www.phparch.com/swag/">All Swag</a></li> </ul> </li> <li id="menu-item-15872" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-15872"><a href="https://www.phparch.com/services/">Services</a> <ul class="sub-menu"> <li id="menu-item-15873" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15873"><a href="https://www.phparch.com/consulting/">Consulting</a></li> </ul> </li> <li id="menu-item-10845" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10845"><a href="https://www.phparch.com/conferences/">Conferences</a> <ul class="sub-menu"> <li id="menu-item-10829" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10829"><a href="https://phptek.io">php[tek]</a></li> </ul> </li> <li id="menu-item-14364" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-14364"><a href="https://www.phparch.com/podcast/">Podcast</a> <ul class="sub-menu"> <li id="menu-item-14363" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-14363"><a href="https://www.phparch.com/podcast-subscribe/">php[podcast]</a></li> <li id="menu-item-16845" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16845"><a href="https://phproundtable.com">PHPRoundtable</a></li> </ul> </li> </ul></div> <ul class="list"> <li class="textCenter barredLeft"><a href="/register" title="Register">Register</a></li> <li class="textCenter barredLeft"><a href="/login" title="Login">Login</a></li> <li class="basket"><a href="/basket" title="View your basket" class="basket_link"> </a></li> <li class="search"> <span class="search"> </span> <form method="get" id="searchform" action="/"> <input type="text" placeholder="search" value="" name="s" id="s"/> <input type="submit" id="searchsubmit" value="GO"/> </form> </li> </ul> </ul> </nav> </div> </div><!-- End Service Bar --> <script type="text/javascript"> var jsonUrl = "https://www.phparch.com/wp-content/plugins/inferno-login//json.php"; </script> <div id="body" class="page-sidebars-none"> <div class="hidden" id="inferno-nonce">bf29737351</div> <div class="main-content"> <h1>Login</h1> <p><b>Don't have an account?</b> <a href="/register">Register Here</a></p> <form name="login-form" id="login-form" method="POST"> <p>Please provide your login details</p> <label class="required above" for="email" elementName="email">E-mail address: <input type="email" required="required" name="email" id="email" value="" > </label> <label for="password" class="required above" elementName="password">Password:</label> <input type="password" required="required" name="password" id="password" value=""> </label> <p><b>Forgot your password?</b> Request a <a tabindex="99" href="/login/request-reset">password reset</a>.</p> <input type="submit" name="login" value="Login" /> </form> </div> </div> <!-- Dialogue panels --> <div class="hidden aligncenter" id="loadingDialog" title="Please wait…"><p style="margin-top: 20px">Accessing backend system…</p><p class="no-indent" style="margin-top: 20px"><img src="https://www.phparch.com/wp-content/themes/phpa/js/css/dark-hive/images/ui-spinner.gif"/></p></div> <div class="hidden" id="sessionErrorDialog" title="Session Expired"><p class="center">We're sorry, but your session has expired due to inactivity. Please use your browser to refresh this page and log in to our system again.</p></div> <div class="hidden" id="genericErrorDialog" title="Error"><p class="center"><span class="message">Message goes here.</span></p></div> <div class="hidden" id="genericRecoverableErrorDialog" title="Error"><p class="center"><span class="message">Message goes here.</span></p></div> <div class="hidden" id="genericMessageDialog" title="Notice"><p class="center"><span class="message">Message goes here.</span></p></div> <div class="hidden" id="genericConfirmDialog" title="Notice"><p class="center"><span class="message">Message goes here.</span></p></div> <!-- End dialogue panels --> <!-- Footer --> <div class="footer"> <div class="footerInterior flex-group"> <div class="flex-box-5"> <h2>About us</h2> <ul> <li><a href="/about">What we do</a></li> <li><a href="/policies/contact-us/">Contact us</a></li> <li><a href="/editorial/write-for-us">Write for us</a></li> <li><a href="/faq">FAQ</a></li> <li><a href="/logos">Logo Download</a></li> </ul> </div> <div class="flex-box-5"> <h2>Policies & legal</h2> <ul> <li><a href="/policies/contact-us">Customer support</a></li> <li><a href="/policies/privacy-policy/">Privacy & Cookie Policy</a></li> <li><a href="/policies/refund-policy/">Refund policy</a></li> <li><a href="/policies/code-of-conduct/">Code of Conduct</a></li> <li><a href="http://www.phparch.com/policies/terms-and-conditions/">Terms & Conditions</a> </li> </ul> </div> <div class="flex-box-5"> <h2>Online Store</h2> <ul> <li><a href="/magazine/">Magazine</a></li> <li><a href="/training/">Training courses</a></li> <li><a href="/books/">Books</a></li> </ul> </div> <div class="flex-box-5"> <h2>Special sections</h2> <ul> <li><a href="https://phptek.io/">PHP Tek Conference</a></li> </ul> </div> <div class="flex-box-5"> <a href="/" id="footer_logo">PHP Architect</a> <div class="follow"> <!-- AddThis Follow BEGIN --> <p>Follow us on:</p> <ul> <li><a href="https://twitter.com/phparch">@phparch on Twitter</li> <li><a href="https://facebook.com/phparch">Facebook</li> <li><a href="https://www.linkedin.com/company/php-architect/">LinkedIn</a></li> </ul> </div> </div><!-- box --> </div><!-- container --> <div class="footerInterior"> <div class="copyright"> <p>Copyright © 2002-2025 PHP Architect, LLC. — All amounts in USD</p></div> </div> </div> <!-- AddThis Follow END --> </div> <!-- End Footer --> <script type="text/javascript" src="/wp-includes/js/jquery/ui/core.min.js?ver=1.13.3" id="jquery-ui-core-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/mouse.min.js?ver=1.13.3" id="jquery-ui-mouse-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/resizable.min.js?ver=1.13.3" id="jquery-ui-resizable-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/draggable.min.js?ver=1.13.3" id="jquery-ui-draggable-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/controlgroup.min.js?ver=1.13.3" id="jquery-ui-controlgroup-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/checkboxradio.min.js?ver=1.13.3" id="jquery-ui-checkboxradio-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/button.min.js?ver=1.13.3" id="jquery-ui-button-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/dialog.min.js?ver=1.13.3" id="jquery-ui-dialog-js"></script> <script type="text/javascript" src="/wp-includes/js/jquery/ui/tabs.min.js?ver=1.13.3" id="jquery-ui-tabs-js"></script> <script type="text/javascript" src="/wp-content/themes/phpa/js/built.min.js?ver=v=1.8" id="global-js"></script> <!-- Perfect Audience Retargeting OAM --> <script type="text/javascript"> (function() { window._pa = window._pa || {}; var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true; pa.src = ('https:' == document.location.protocol ? 'https:' : 'http:') + "//tag.perfectaudience.com/serve/54527ae7fddee4aa81000132.js"; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pa, s); })(); </script> <!-- End Perfect Audience Retargeting --></body> </html>