PageSourceSearch

https://timwhitlock.info/about-tim-whitlock/php/

html timwhitlock.info collected 2026-10-02 02:50:19 UTC 26,371 bytes, 188 lines download raw bytes

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 &raquo; Feed" href="https://timwhitlock.info/feed/" />
23<link rel="alternate" type="application/rss+xml" title="timwhitlock.info &raquo; 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&#038;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 &#8211; 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 &hellip;" 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&#8217;ve been writing PHP since about 2002.</p>
124<p>I&#8217;ve stuck with it over the years despite the temptation to learn new languages. I learned early on in my career that skill-hopping &#8211; although good for business &#8211; 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&#8217;s the first framework I&#8217;ve used in years that I&#8217;m constantly impressed with. In fact it&#8217;s the only framework I&#8217;ve ever used whose idiosyncrasies always turn out to be based on solid engineering rather than the whim of its author. It&#8217;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&#8217;m experienced in developing WordPress themes from scratch and also developing plugins. I&#8217;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&#039;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                &copy;
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.