1<!DOCTYPE html> 2<!--[if IE 7]> 3<html class="ie ie7" lang="en-US"> 4<![endif]--> 5<!--[if IE 8]> 6<html class="ie ie8" lang="en-US"> 7<![endif]--> 8<!--[if !(IE 7) & !(IE 8)]><!--> 9<html lang="en-US"> 10<!--<![endif]--> 11<head> 12 <meta charset="UTF-8"> 13 <meta name="viewport" content="width=device-width"> 14 <title>PHP | timwhitlock.info</title> 15 <link rel="profile" href="https://gmpg.org/xfn/11"> 16 <link rel="pingback" href="https://timwhitlock.info/xmlrpc.php"> 17 <!--[if lt IE 9]> 18
18<script src="https://cf.timwhitlock.info/wp-content/themes/twentyfourteen/js/html5.js?ver=3.7.0"></script>
18 19 <![endif]--> 20 <meta name='robots' content='max-image-preview:large' /> 21<link rel='dns-prefetch' href='//cf.timwhitlock.info' /> 22<link rel="alternate" type="application/rss+xml" title="timwhitlock.info » Feed" href="https://timwhitlock.info/feed/" /> 23<link rel="alternate" type="application/rss+xml" title="timwhitlock.info » Comments Feed" href="https://timwhitlock.info/comments/feed/" />
24<script> 25window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/cf.timwhitlock.info\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.4.2"}}; 26/*! This file is auto-generated */ 27!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,"\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c\udfff","\ud83e\udef1\ud83c\udffb\u200b\ud83e\udef2\ud83c\udfff")}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); 28</script>
28 29<style id='wp-emoji-styles-inline-css'> 30 31 img.wp-smiley, img.emoji { 32 display: inline !important; 33 border: none !important; 34 box-shadow: none !important; 35 height: 1em !important; 36 width: 1em !important; 37 margin: 0 0.07em !important; 38 vertical-align: -0.1em !important; 39 background: none !important; 40 padding: 0 !important; 41 } 42</style> 43<link rel='stylesheet' id='wp-block-library-css' href='https://cf.timwhitlock.info/wp-includes/css/dist/block-library/style.min.css?ver=6.4.2' media='all' /> 44<style id='wp-block-library-theme-inline-css'> 45.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video{margin:0 0 1em}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em} 46</style> 47<style id='classic-theme-styles-inline-css'> 48/*! This file is auto-generated */ 49.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} 50</style> 51<style id='global-styles-inline-css'> 52body{--wp--preset--color--black: #000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--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--color--green: #24890d;--wp--preset--color--dark-gray: #2b2b2b;--wp--preset--color--medium-gray: #767676;--wp--preset--color--light-gray: #f5f5f5;--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,
520,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-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{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;}
52.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;} 53.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;} 54:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 55:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 56.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;} 57</style>
58<link rel='stylesheet' id='genericons-css' href='https://cf.timwhitlock.info/wp-content/themes/twentyfourteen/genericons/genericons.css?ver=3.0.3' media='all' /> 59<link rel='stylesheet' id='twentyfourteen-style-css' href='https://cf.timwhitlock.info/wp-content/themes/timwhitlock/css/tw.css?v=1.0.7' media='all' /> 60<link rel='stylesheet' id='twentyfourteen-lato-css' href='https://cf.timwhitlock.info/wp-content/themes/twentyfourteen/fonts/font-lato.css?ver=20230328' media='all' /> 61<link rel='stylesheet' id='twentyfourteen-block-style-css' href='https://cf.timwhitlock.info/wp-content/themes/twentyfourteen/css/blocks.css?ver=20230630' media='all' /> 62<!--[if lt IE 9]> 63<link rel='stylesheet' id='twentyfourteen-ie-css' href='https://cf.timwhitlock.info/wp-content/themes/twentyfourteen/css/ie.css?ver=20140711' media='all' /> 64<![endif]--> 65<link rel="https://api.w.org/" href="https://timwhitlock.info/wp-json/" /><link rel="alternate" type="application/json" href="https://timwhitlock.info/wp-json/wp/v2/pages/568" /><link rel="canonical" href="https://timwhitlock.info/about-tim-whitlock/php/" /> 66<link rel="alternate" type="application/json+oembed" href="https://timwhitlock.info/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftimwhitlock.info%2Fabout-tim-whitlock%2Fphp%2F" /> 67<link rel="alternate" type="text/xml+oembed" href="https://timwhitlock.info/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftimwhitlock.info%2Fabout-tim-whitlock%2Fphp%2F&format=xml" /> 68<meta name="description" content="My server side language of choice is PHP, which I have been writing for some years - since PHP4 first replaced PHP3, whenever that was. Find posts tagged PHP on this blog . Frameworks I have maintained my own PHP framework since around 2004." /> 69<meta property="og:site_name" content="timwhitlock.info" /> 70<meta property="og:url" content="https://timwhitlock.info/about-tim-whitlock/php/" /> 71<meta property="og:type" content="website" /> 72<meta property="og:title" content="PHP" />
73<meta property="og:image" content="https://cf.timwhitlock.info/wp-content/themes/timwhitlock/img/tw-300.png?v=1.0.7" /> 74<meta property="fb:admins" content="100000668227766" /> 75 <style id="wp-custom-css"> 76 /* test */ </style> 77 </head> 78 79<body class="page-template-default page page-id-568 page-child parent-pageid-397 wp-embed-responsive masthead-fixed full-width singular"> 80<div id="page" class="hfeed site"> 81 82 <header id="masthead" class="site-header"> 83 <div class="header-main"> 84 <h1 class="site-title"><a href="https://timwhitlock.info/" rel="home">timwhitlock.info</a></h1> 85 86 <div class="search-toggle"> 87 <a href="#search-container" class="screen-reader-text" aria-expanded="false" aria-controls="search-container"> 88 Search </a> 89 </div> 90 91 <nav id="primary-navigation" class="site-navigation primary-navigation"> 92 <button class="menu-toggle">Primary Menu</button> 93 <a class="screen-reader-text skip-link" href="#content"> 94 Skip to content </a> 95 <div class="menu-primary-container"><ul id="primary-menu" class="nav-menu"><li id="menu-item-2803" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-page-ancestor menu-item-2803"><a title="About Developer Tim Whitlock" href="https://timwhitlock.info/">Me</a></li> 96<li id="menu-item-2796" class="menu-item menu-item-type-post_type menu-item-object-proj menu-item-2796"><a title="About Loco – Translation Management" href="https://timwhitlock.info/projects/loco-localisation-management/">Loco</a></li> 97</ul></div> </nav> 98 </div> 99 100 <div id="search-container" class="search-box-wrapper hide"> 101 <div class="search-box"> 102 <form role="search" method="get" class="search-form" action="https://timwhitlock.info/"> 103 <label> 104 <span class="screen-reader-text">Search for:</span> 105 <input type="search" class="search-field" placeholder="Search …" value="" name="s" /> 106 </label> 107 <input type="submit" class="search-submit" value="Search" /> 108 </form> </div> 109 </div> 110 </header><!-- #masthead --> 111 112 <div id="main" class="site-main"> 113 114<div id="main-content" class="main-content"> 115 116 <div id="primary" class="content-area"> 117 <div id="content" class="site-content" role="main"> 118 119 120<article id="post-568" class="post-568 page type-page status-publish hentry"> 121 <header class="entry-header"><h1 class="entry-title">PHP</h1></header><!-- .entry-header --> 122 <div class="entry-content"> 123 <p>I’ve been writing PHP since about 2002.</p> 124<p>I’ve stuck with it over the years despite the temptation to learn new languages. I learned early on in my career that skill-hopping – although good for business – is bad for developing real expertise.<span id="more-568"></span></p> 125<p><strong>Symfony</strong></p> 126<p>My framework of choice for most projects is Symfony. It’s the first framework I’ve used in years that I’m constantly impressed with. In fact it’s the only framework I’ve ever used whose idiosyncrasies always turn out to be based on solid engineering rather than the whim of its author. It’s chock full of good practices and design patterns that I find myself learning from the more I use it.</p> 127<p><strong>WordPress</strong></p> 128<p>For simpler projects that largely comprise the publishing of content, I tend to recommend WordPress. I have worked on numerous such projects over the last few years, including two sites for MTV, <a href="http://mtvvoices.com/en/" target="_blank" rel="noopener">Voices</a> and <a href="http://stayingalivefoundation.org/" target="_blank" rel="noopener">Staying Alive</a>.</p> 129<p>I’m experienced in developing WordPress themes from scratch and also developing plugins. I’ve published a few plugins to the official WordPress directory too. My most popular being <a href="http://wordpress.org/plugins/loco-translate/" target="_blank" rel="noopener">Loco Translate</a> which is installed on over half a million websites.</p> 130 </div><!-- .entry-content --> 131</article><!-- #post-568 --> 132 133 </div><!-- #content --> 134 </div><!-- #primary --> 135 </div><!-- #main-content --> 136 137<div id="secondary"> 138 <h2 class="site-description">Tim Whitlock's personal site and blog</h2> 139 140 141 <div id="primary-sidebar" class="primary-sidebar widget-area" role="complementary">
142 <aside id="text-2" class="widget widget_text"><h1 class="widget-title">Other profiles</h1> <div class="textwidget"><ul> 143 <li><a class="genericon-linkedin-alt" href="http://www.linkedin.com/in/timwhitlock">Link me</a></li> 144 <li><a class="genericon-twitter" href="https://twitter.com/timwhitlock">Tweet me</a></li> 145<li><a class="genericon-github" href="https://github.com/timwhitlock">Fork me</a></li> 146</ul> 147</div> 148 </aside> 149 <aside id="recent-posts-3" class="widget widget_recent_entries"> 150 <h1 class="widget-title">Recent Blog Posts</h1><nav aria-label="Recent Blog Posts"> 151 <ul> 152 <li> 153 <a href="https://timwhitlock.info/blog/2018/05/storing-personal-data-with-free-cloud-providers/">Storing personal data with free cloud providers</a> 154 <span class="post-date">May 29, 2018</span> 155 </li> 156 <li> 157 <a href="https://timwhitlock.info/blog/2018/05/data-processing-addendums/">Data Processing Addendums</a> 158 <span class="post-date">May 27, 2018</span> 159 </li> 160 <li> 161 <a href="https://timwhitlock.info/blog/2018/03/the-state-of-messaging/">The state of messaging</a> 162 <span class="post-date">Mar 7, 2018</span> 163 </li> 164 </ul> 165 166 </nav></aside> </div><!-- #primary-sidebar --> 167 </div><!-- #secondary --> 168 169 </div><!-- #main --> 170 171 <footer id="colophon" class="site-footer" role="contentinfo"> 172 173 174 <div class="site-info"> 175 © 176 <a href="/" target="_blank"> 177 <span>Tim Whitlock</span> 178 </a> 179 2008-2026 180 </div> 181 182 </footer><!-- #colophon --> 183 </div><!-- #page --> 184 185
185<script src="https://cf.timwhitlock.info/wp-content/themes/timwhitlock/js/tw.js?v=1.0.7" id="twentyfourteen-script-js" defer data-wp-strategy="defer"></script>
vendor: 1 bytes, line 185
185
186<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"af350f565897494c9c48483c93fcd0c4","r":1,"spa":2}' crossorigin="anonymous"></script>
186 187</body> 188</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.