Can I Use Popular Framework Features Without a Framework?

If you’ve been wondering about this question, the answer is YES!

There are many tools and libraries in the PHP ecosystem that we can use when developing an application. Some of them are grouped in frameworks which provide us some preconfigured structure. But with such variety of tools, we can easily make our own structure according to our needs.

In this article I will take a look and list some popular libraries for the different technical needs of our applications, such as talking to the database, routing, providing output to the web and etc.

PHP, frameworks,

But first, let’s get back to basics and explain what a framework is.

According to the general definition:

Framework is a universal, reusable software platform to develop software applications, products and solutions. To simplify, it is kind of library, piece of software which provides web developers with code base and consistent, standardized ways of creating web applications.

Your project will have to choose from tons of PHP libraries, frameworks and components. In addition, there are many PHP libraries, frameworks and components to adopt from. And these are called project dependencies like Composer and PEAR. Until recently PHP didn’t find acceptable way to manage these project dependencies. Some of the dependencies explained below show how can you use PHP without frameworks.

  • Composer repositories like Composer, PEAR, VSC

A dependency manager which installs packages locally with package description and name and version. In basics, package is just a directory containing something. In this case, it is a PHP code, but in theory it could be anything.

Repository is a package source. Practically it is a list of packages/versions. The composer will search in all your repositories to find the packages your project requires.

  • Databases like MySQL, PostgreSQL, NoSQL

There will be times when your PHP code will use database to persist information and there are few options to connect and interact with your database.

  • Object-relational mapping (ORM) like Doctrine, Readbean, Eloquent

The ORM manages the translation of object into relational databases and vice-versa. This creates so-called “virtual object database” which can be used from within the programming language.

  • Templating like Twig, Blade, Mustache, Plain PHP Templates

Templates provide convenient way of separating the controller and domain logic from your presentation logic. They typically contain the HTML of the application, but may be also used for other formats such as XML. Templates are often referred to as “views” which make up part of the second component of the model-view-controller (MVC) software architecture pattern.

  • HTTP like Guzzle, Buzz, HTTPFul, Requests

This is protocol destined for sending documents back and forth over the World Wide Web. A protocol is a set of rules that is used to identify which messages can be transferred and which are suitable answers to other queries.

  • Mailers like PHPMailer, SwiftMailer, Stampie

Mailers are libraries used in order to give the application an ability to send mails.

  • File Systems like Gaufrette, Flysystem, CSV

Libraries for file manipulation and MIME (Multipurpose Internet Mail Extensions) type detection.

  • Testing like PHP Spec, PHP Unit

Writing automated tests for your PHP code is considered to be a best practice and can lead to well-build applications. Automated tests are a great tool for making sure your application does not break when you are making changes or adding new functionality and should not be ignored.

PHP, code, frameworks

However some of the dependencies will not be used by your application and may not be essential, therefore you can easily create your own PHP project containing custom dependencies that are most suitable for the project.

To sum up, using framework can bring to faster development as it tries to save your work by make you define an overly complex configuration that has to accommodate every possible use case.


The Best Way to Learn PHP

Learning something from scratch is almost always an arduous affair — you simply have no idea as to where to start, or not to start, to kick things off. I loathed learning about the idiosyncrasies of C++’s syntax when all I wanted to learn were some darn programming concepts. As I’m sure you can agree, this is a less than ideal situation.

This is where the Nettuts+ “The Best Way to Learn” series comes into the picture. This series is intended to be your blueprint, your road map, your plan of action for learning your topic of choice! You don’t have to worry about finding the best resources, sorting out the bad ones, and figuring out what to learn next. It’s all here. Just follow it, step by step.

Today, we’re going to figure out the best way to learn PHP.

If you need immediate help, try working with one of the experienced PHP developers on Envato Studio. They can fix PHP errors, add features, or even create new apps for you.

PHP developers on Envato Studio
PHP developers on Envato Studio

If you’re reading this, chances are that you’ve Googled a lot to decide which language to learn and how. And without a doubt, you must have run into a ton of articles about how language X is so much better than PHP – and PHP is going to die through obscurity soon.

Haters gonna hate!

As the popular saying goes, haters gonna hate! PHP has been at the helm of the web as you know it and that’s for a very good reason. It’s a mature language, has excellent documentation and a massive number of learning resources along with a great variety of utilities built around it.

And let’s not forget the sheer proliferation of hosts and frameworks PHP has spawned. Like Heroku like hosting? Don’t worry, there are a number of excellent options for PHP as well!

Tut image

You could just install PHP but it gets quite boring without a server and some sort of database to play around with. And as a beginner, it’s not really trivial work to get all of these installed and configure each to work with the others without issue.

This is where you grab a package such as XAMPP. These life savers typically install Apache, your web server, along with mySQL, a database system along with PHP significantly cutting down on set up time.

Bonus points if you’re the code monkey type and install everything by hand.

You can also try LAMP, WAMP…….

Before I send you off to alternate sources for PHP enlightenment, let me first refer you to our very own series for absolute beginners from none other than your favorite editor, Jeffrey Way.

In this series, over the course of 40+ screencasts, everything from installing PHP to variables, from functions to working with MySQL is covered.

For learning basics, w3schools can be a great place. try it……..

Tut image

Khan Academy may sound like an odd choice since there are no PHP lessons in there but trust me, it’s a good choice. What you can’t find in pure PHP, you can find in the basic of programming. For example, if you’re new to the entire programming hoopla, this is a great place to start.

Another great place to start is Lynda. Here at Envato we have immense respect for those teaching there — the content is usually top notch and cover their topics well. And they cover a vast range of topics as well. If you need a specific lesson, this is where you should begin.

The videos should give you an very good springboard, but, hopefully, hungry for more knowledge. The below books should give you a more elaborate introduction and lots of varied topics for you to devour.

If you feel bored reading the initial portions, good, just skip ahead to the portions where your head hurts.

Nettuts image

Author: David Powers

“So why another PHP book? Well, not everyone who uses PHP is a programmer. PHP is the most common dynamic web language used by designers, if their web sites require dynamic functionality, and there are hordes of novice users who want to set up dynamic web sites.”

Nettuts image

Author: Jason Lengstorf

“PHP for Absolute Beginners starts at the very beginning stages of web programming, showing even the most inexperienced web developer, through examples, how to build a basic content management system. The book dives directly into writing web applications with accompanying explanation rather than explaining elements of the language and then showing examples.”

Nettuts image

Author: Adam Trachtenberg

“PHP Cookbook has a wealth of solutions for problems that you’ll face regularly. With topics that range from beginner questions to advanced web programming techniques, this guide contains practical examples — or “recipes” — for anyone who uses this scripting language to generate dynamic web content.”

This is the perfect time to build something simple with your new found knowledge.

Alright! With all those information swirling inside, you should feel like a rockstar. If not, don’t worry, it’s completely normal. Talk to me later so we can share notes about how daft we feel.

This is the perfect time to try and build something simple with your new found knowledge. It’s best to not try to build something too complicated and fail though — it’s a lot more disheartening than you’d think. Imagine being rejected for the first time. Now multiply it by a few hundred and you’ll be close.

Since you’re just starting out, play it safe and build something absolutely basic like a CRUD app. Nothing major — a few inputs and an ‘uncool’ table to display saved results. This tiny exercise will test your knowledge of a lot of PHP basics including the much vaunted ‘interfacing with a database’ skill.

Feeling better now? You should! You gazed upon where there was naught and said ‘This won’t do!’ and created something from scratch. If it were me, I’d be pumped. Let’s use it to extend our knowledge a little more.

While a simple CRUD app is a great start, you’d ideally need more complicated. A simple login/user system is absolutely great for this.

You get to learn how sessions work, how basic authentication is done, how to implement basic security measure and a ton more.

Note: If you’re in need of a little guidance, start here.

Tut image

At this point, after creating a non-trivial system, you probably have noticed how repetitive some of the work is. Why the heck do you need to write your own sessions class or work on hashing passwords yourself? The answer, my friends, is to go with a lightweight framework.

A framework abstracts a lot of the repetitive, boilerplate features in your typical application thus freeing up your brain to actually getting things done.

Note: CodeIgniter, a very lightweight, yet powerful framework. If you prefer Kohana, we do that too!

Tut image

Now that you’ve been with a lightweight framework, you can now check out the alternate path — a full stack framework. A full stack framework typically ships with a lot more features including code generators, ORMs and an inbuilt server. An excellent choice would be CakePHP — the PHP equivalent of Rails.

The reason you need to check these out later is because there is a lot of ‘magic’ going on. Without a solid understanding of how lightweight frameworks work, it’s hard to really dig into the better featured ones since you’ll mostly be lost and won’t understand how things work.

Note: I recommends both FuelPHP and Laravel as top-notch, modern PHP frameworks.


With all that information behind you, giving you Indiana’s swagger, now is the time to build something truly awesome. This is the final destination for PHP nirvana — and the choice is up to you.

So what exactly should you be building? Here are a few ideas:

  • A blog is always a safe option. There are a ton of open source solutions for you to get inspiration for the software architecture and the functionality requirements are unambiguous.
  • It’s a little old school but a discussion board is another excellent choice. Moderator rights and post counts, ahoy! If you need a little guidance, this tutorial is a great place to start.
  • Or if you’re too hip for any of these, build yourself a project management application or even just a todo list. They’re always fun to build and you’ll almost always end up using it personally.

Of course, there are just suggestions. No one is stopping you from building a multi-user, realtime chatroom or a service which receives input from random internet strangers and lights up stuff in your room. No one’s judging, go crazy!

Development is as much about the workflow as much as it is about the code.

Development is as much about the workflow as much as it is about the code. Recently, a typical developer’s workflow has been massively improved by version control as well as platform as a service solutions.

Version control, as expected, frees you up from having to manage revisions manually while PaaS solutions save you from having to do a lot of sys admin work just to get your app to scale.

You can getting started with Git.

New techniques and tools are being introduced everyday.

The web development industry is rarely in a state of equilibrium — everything is changing all the time. New techniques and tools are being introduced everyday and it’s important that you not only read about them but also start contributing.

Find a little glitch in some framework? Submit a patch. Added some new functionality? Patch away! These not only earn you good karma but also valuable points on your resume.

And, oh, about the keeping up to date stuff? Subscribe to our feed and follow us  and I promise you’ll know all you need to know!


Even though that you are a master of the PHP domain, you can’t afford to, or shouldn’t, rest. PHP is a grand language but that doesn’t mean that it does absolutely everything perfectly.

There is an ever increasing number of new languages out there each adding their own spin to solving a very specific problem that you simply can’t afford to miss out on. And learning something new something doesn’t really wipe out knowledge gained earlier does it? Well, except Star Wars, of course. Those new movies were a crapshoot.

Ruby, Python and Clojure are some of the languages that I’m constantly amazed by and I think they deserve your attention as well. Neither of these languages are necessarily ‘better’ than PHP but each of them do things their own unique way and you owe yourself a chance to take a look and find out whether that approach is for you.

Well, this is the end of the road, partner! Hopefully, this plan can help you become a PHP master and, indeed, take over the world.

If you feel that I’m missing some obvious resources here, feel free to yell at me in the comments section below and I’ll update this article whilst crying silently. Thank you so much for reading!

21 Essential PHP Interview Questions –

Consider the following code:

$str1 = 'yabadabadoo';
$str2 = 'yaba';
if (strpos($str1,$str2)) {
    echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";
} else {
    echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";

The output will be:

"yabadabadoo" does not contain "yaba"

Why? How can this code be fixed to work correctly?

The problem here is that strpos() returns the starting position index of $str1 in $str2 (if found), otherwise it returns false. So in this example, strpos() returns 0 (which is then coerced to false when referenced in the if statement). That’s why the code doesn’t work properly.

The correct solution would be to explicitly compare the value returned by strpos() to false as follows:

$str1 = 'yabadabadoo';
$str2 = 'yaba';
if (strpos($str1,$str2) !== false) {
    echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";
} else {
    echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";

Note that we used the !== operator, not just the != operator. If we use !=, we’ll be back to the problem that 0 is coerced to false when referenced in a boolean expression, so 0 != false will evaluate to false.

What will be the output of the code below and why?

$x = 5;
echo $x;
echo "<br />";
echo $x+++$x++;
echo "<br />";
echo $x;
echo "<br />";
echo $x---$x--;
echo "<br />";
echo $x;

What will be the values of $a and $b after the code below is executed? Explain your answer.

$a = '1';
$b = &$a;
$b = "2$b";

Both $a and $b will be equal to the string "21" after the above code is executed.

Here’s why:

The statement $b = &$a; sets $b equal to a reference to $a (as opposed to setting $b to the then-current value of $a). Thereafter, as long as $b remains a reference to $a, anything done to $a will affect $b and vice versa.

So when we subsequently execute the statement $b = "2$b", $b is set equal to the string "2" followed by the then-current value of $b (which is the same as $a) which is 1, so this results in $b being set equal to the string "21" (i.e., the concatenation of "2" and "1"). And, since $b is a reference to $a, this has the same affect on the value of $a, so both end up equal to "21".

What will be the output of each of the statements below and why?

var_dump(0123 == 123);
var_dump('0123' == 123);
var_dump('0123' === 123);

var_dump(0123 == 123) will output bool(false) because the leading 0 in 0123 tells the PHP interpreter to treat the value as octal (rather than decimal) value, and 123 octal is equal to 83 decimal, so the values are not equal.

var_dump('0123' == 123) will output bool(true) since the string 0123 will automatically be coerced to an integer when being compared with an integer value. Interestingly, when this conversion is performed, the leading 0 is ignored and the value is treated as a decimal (rather than octal) value, so the values are bother 123 (decimal) and are therefore equal.

var_dump('0123' === 123) outputs bool(false) since it performs a more strict comparison and does not do the automatic type coercion of the string to an integer.

What is the problem with the code below? What will it output? How can it be fixed?

$referenceTable = array();
$referenceTable['val1'] = array(1, 2);
$referenceTable['val2'] = 3;
$referenceTable['val3'] = array(4, 5);

$testArray = array();

$testArray = array_merge($testArray, $referenceTable['val1']);
$testArray = array_merge($testArray, $referenceTable['val2']);
$testArray = array_merge($testArray, $referenceTable['val3']);

The output will be as follows:

array(2) { [0]=> int(1) [1]=> int(2) }

You may also see two warnings generated, similar to the following:

Warning: array_merge(): Argument #2 is not an array
Warning: array_merge(): Argument #1 is not an array

The issue here is that, if either the first or second argument to array_merge() is not an array, the return value will be NULL. For example, although one might reasonably expect that a call such as array_merge($someValidArray, NULL) would simply return $someValidArray, it instead returns NULL! (And to make matters worse, this is not documented well at all in the PHP documentation.)

As a result, the call to $testArray = array_merge($testArray, $referenceTable['val2']) evaluates to $testArray = array_merge($testArray, 3) and, since 3 is not of type array, this call to array_merge() returns NULL, which in turn ends up setting $testArray equal to NULL. Then, when we get to the next call to array_merge(), $testArray is now NULL so array_merge() again returns NULL. (This also explains why the first warning complains about argument #2 and the second warning complains about argument #1.)

The fix for this is straightforward. If we simply typecast the second argument to an array, we will get the desired results. The corrected array_merge() calls would therefore be as follows:

$testArray = array_merge($testArray, (array)$referenceTable['val1']);
$testArray = array_merge($testArray, (array)$referenceTable['val2']);
$testArray = array_merge($testArray, (array)$referenceTable['val3']);

which will yield the following output (and no warnings):

array(2) { [0]=> int(1) [1]=> int(2) } 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }

What will this code output and why?

$x = true and false;

Surprisingly to many, the above code will output bool(true) seeming to imply that the and operator is behaving instead as an or.

The issue here is that the = operator takes precedence over the and operator in order of operations, so the statement $x = true and false ends up being functionally equivalent to:

$x = true;       // sets $x equal to true
true and false;  // results in false, but has no affect on anything

This is, incidentally, a great example of why using parentheses to clearly specify your intent is generally a good practice, in any language. For example, if the above statement $x = true and false were replaced with $x = (true and false), then $x would be set to false as expected.

What will $x be equal to after the statement $x = 3 + "15%" + "$25"?

The correct answer is 18.

Here’s why:

PHP supports automatic type conversion based on the context in which a variable or value is being used.

If you perform an arithmetic operation on an expression that contains a string, that string will be interpreted as the appropriate numeric type for the purposes of evaluating the expression. So, if the string begins with one or more numeric characters, the remainder of the string (if any) will be ignored and the numeric value is interpreted as the appropriate numeric type. On the other hand, if the string begins with a non-numeric character, then it will evaluate to zero.

With that understanding, we can see that "15%" evaluates to the numeric value 15 and "$25" evaluates to the numeric value zero, which explains why the result of the statement $x = 3 + "15%" + "$25" is 18 (i.e., 3 + 15 + 0).

After the code below is executed, what will be the value of $text and what will strlen($text) return? Explain your answer.

$text = 'John ';
$text[10] = 'Doe';

After the above code is executed, the value of $text will be the string “John D” (i.e., “John”, followed by 5 spaces, followed by “D”) and strlen($text) will return 11.

There are two things going on here.

First of all, since $text is a string, setting a single element of $text simply sets that single character to the value specified. The statement $text[10] = 'Doe' therefore sets that single character to 'D' (i.e., the first character in the string "Doe", since an element of a string can only be a single character).

Secondly, $text[10] = 'Doe' says to set the 11th character of the string (remember that indices are zero-based) to 'D'. Prior to that statement, though, the length of the string $text ("John ") was only 5. Whereas compilers or interpreters in other languages might barf (with something akin to an out-of-bounds-index error) when you then attempt to set the 11th character of a 5 character string, PHP instead is very “accommodating” and instead allows this and sets all intermediate characters to blanks.

PHP_INT_MAX is a PHP constant that corresponds to the largest supported integer value (value is based on the version of PHP being run and the platform it is running on).

Assume that var_dump(PHP_INT_MAX) will yield int(9223372036854775807).

In that case, what will be the result of var_dump(PHP_INT_MAX + 1)? Also, what will be the result of var_dump((int)(PHP_INT_MAX + 1))?

NOTE: It’s not important to supply the exact value when answering the question, but rather to explain what will happen and why.

The result of var_dump(PHP_INT_MAX + 1) will be displayed as a double (in the case of this specific example, it will display double(9.2233720368548E+18)). The key here is for the candidate to know that PHP handles large integers by converting them to doubles (which can store larger values).

And interestingly, the result of var_dump((int)(PHP_INT_MAX + 1)) will be displayed as a negative number (in the case of this specific example, it will display int(-9223372036854775808)). Again, the key here is for the candidate to know that the value will be displayed as a negative number, not to know the precise value.

How would you sort an array of strings to their natural case-insensitive order, while maintaing their original index association?

For example, the following array:

	'0' => 'z1',
	'1' => 'Z10',
	'2' => 'z12',
	'3' => 'Z2',
	'4' => 'z3',

After sorting, should become:

	'0' => 'z1',
	'3' => 'Z2',
	'4' => 'z3',
	'1' => 'Z10',
	'2' => 'z12',

The trick to solving this problem is to use three special flags with the standard asort() library function:


The function asort() is a variant of the standard function sort() that preserves the index association. The three flags used above SORT_STRING, SORT_FLAG_CASE and SORT_NATURAL forces the sort function to treat the items as strings, sort in a case-insensitive way and maintain natural order respectively.

Note: Using the natcasesort() function would not be a correct answer, since it would not maintain the original index association of the elements of the array.

What is PEAR in php?

PEAR (PHP Extension and Application Repository) is a framework and repository for reusable PHP components. PEAR is a code repository containing all kinds of php code snippets and libraries.

PEAR also offers a command-line interface that can be used to automatically install packages.

What are the differences between echo and print in PHP?

echo and print are largely the same in PHP. Both are used to output data to the screen.

The only differences are as follows:

  1. echo does not return a value whereas print does return a value of 1 (this enables print to be used in expressions).
  2. echo can accept multiple parameters (although such usage is rare) while print can only take a single argument.

Consider the following code:

$x = NULL;

if ('0xFF' == 255) {
    $x = (int)'0xFF';

What will be the value of $x after this code executes? Explain your answer.

Perhaps surprisingly, the answer is neither NULL nor 255. Rather, the answer is that $x will equal 0 (zero).


First, let’s consider whether '0xFF' == 255 will evaluate to true or false. When a hex string is loosely compared to an integer, it is converted to an integer. Internally, PHP uses is_numeric_string to detect that the string contains a hex value and converts it to an integer (since the other operand is an integer). So in this case, ‘0xFF’ is converted to its integer equivalent which is 255. Since 255 = 255, this condition evaluates to true. (Note that this only works for hex strings, not for octal or binary strings.)

But if that’s the case, shouldn’t the statement $x = (int)'0xFF'; execute and result in $x being set equal to 255?

Well, the statement does execute, but it results in $x being set equal to 0, not 255 (i.e., it is not set to the integer equivalent of ‘0xFF’). The reason is that the explicit type cast of the string to an integer uses convert_to_long (which works differently than the is_numeric_string function that was used in evaluating the conditional expression, as explained above). convert_to_long processes the string one character at a time from left to right and stops at the first non-numeric character that it reaches. In the case of ‘0xFF’, the first non-numeric character is ‘x’, so the only part of the string processed is the initial ‘0’. As a result, the value returned by (int)'0xFF' is 0, so when the code completes, $x will be equal to 0.


What is use of the header() function in PHP?

  1. header() is used to redirect from one page to another: header("Location: index.php");
  2. header() is used to send an HTTP status code: header("HTTP/1.0 this Not Found");
  3. header() is used to send a raw HTTP header: header('Content-Type: application/json');

What is the difference between include_once() and require_once(), which one would you use in circumstances where you need to connect to a database, and why?

include_once() or include allows a file to be included, and in cases where the file is missing or has the wrong name, we receive an error message and execution will still continue regardless.

On the other hand, require_once() or require would be suitable in cases where a file needs to be included once and if it is missing or has a wrong name then we receive a fatal error and the execution of the program stops.

require_once or require is a suitable method in cases where a database connection file is involved and helps alleviate the possibility of multiple instances of the same file being included several times.

How can you tell if a number is even or odd without using any condition or loop?



echo "Your number is: ".$arr[$check%2];

What is the difference between session and quickies?

Session stores the value on the server and quickies stores the value on the user’s browser.

What does the follow code echo?

$a = "PHP";
$a = $a + 1;
echo $a;

The number 1.

$str = 'drinking giving jogging 喝 喝 passing 制图 giving 跑步 吃';  // Example input 

Highlight all the Chinese characters in red and return the string.

$str = 'drinking giving jogging 喝 喝 passing 制图 giving 跑步 吃';
$string = explode(' ', $str);
$chi = array_filter( explode('_', preg_replace(array('/[^\p{Han}?]/u', '/(\s)+/'), array('_', '$1'), $str)));
$value = array ();
foreach ($string as $s) {
           if (in_array($s, $chi)) {
               $value[] = ''.$s.'';
           } else {
               $value[] = $s;

return (implode(' ', $value));

Write a sample of code showing the nested ternary conditional operator in PHP.

$number_class = $number == 0 ? 'blue' : ($number > 0 ? 'green' : 'red');

Here we are assigning different strings to the number_class variable based on a numeric value ($number).

What are Traits?

Traits are a mechanism that provides some of the reuse advantages of multiple inheritance in languages like PHP where multiple inheritance is not supported. Traits enable developers to reuse combinations of methods from different class hierarchies.

10 PHP interview questions and answers – (upwork)

  • Q

    Do you have any experience with LAMP?


    LAMP is an open-source solution stack that contains everything you need to create a complete, stand-alone platform for your web application—Linux, Apache, MySQL, and PHP. This question is a good opportunity for your prospective programmer to detail any experience they have taking a web project from conception to completion.


  • Q

    What are PHP sessions and how do they work?


    What you’re really asking is whether they know how to use session_start(). It either creates or resumes a session based on an identifier that is sent to the server via a GET or POST request or a cookie. The most common use case scenario on the web is when a website won’t let you comment or post without first prompting a login. How does it know whether you’re logged in? One way would be to place a cookie in the user’s browser; on every request the cookie is sent server-side, where PHP can be used to determine which information is sent back and displayed to the client. While session_start() saves session data in files by default, it is also possible to store sessions directly in the database.


  • Q

    How are classes loaded in PHP?


    This is a good way to gauge a developer’s understanding of autoloading. Whenever a class is instantiated, a function is triggered. You can register a function with the spl_autoload que detailed below, courtesy of

    bool spl_autoload_register ([ callable $autoload_function [, bool$throw = true [, bool $prepend = false ]]] )


  • Q

    What are some of your favorite PHP design patterns?


    Design patterns are basically best-practice templates that programmers can use to consistently write well-designed code more quickly. Here are a couple examples along with their use cases:

    The Singleton: Used when you only want to allow access to one instance of a particular class.

    The Factory: The factory pattern makes it
    easier to create multiple classes without repeating code. To change,
    rename, or replace the class, simply modify the factory.


  • Q

    Determine the value of $pear after executing the code below. What will strlen($pear) return? Explain your answer.


    $pear = ‘PEAR ’;
    $pear[12] = ‘PHP Extension and Application Repository’;

    This question reveals a few interesting things about the way PHP interprets code. The value of $pear in the code above will be the string “PEAR P” or the string “PEAR ” followed by seven spaces, followed by “P,” which is the first character in the string “PHP Extension and Application Repository.” The value returned by strlen($pear) will thus be 13. Since an element of a string can only consist of one character, and the count of elements within a string starts with 0, $pear[12] sets the 13th character of the string to the letter “P.” Interestingly enough, we chose to set the 13th value of a string that only has five characters. While other language interpreters might have thrown an out-of-bounds index error, PHP is more forgiving and fills in the blanks with empty spaces.


  • Q

    Determine the output of the code below. Explain your answer.


    var_dump(42 == 042);
    var_dump(‘042’ == 42);
    var_dump(‘042’ === 42);

    This question quizzes the coder on how the PHP interpreter handles numbers and strings.
    i. var_dump(42 == 042); will output bool(false) because the PHP interpreter treats leading zeroes as octals. 042 is 32 in decimal, which does not equal 42.
    ii. var_dump(‘042’ == 42); will output bool(true) because PHP interpreter will coerce the string into an integer but ignore the leading zero. 42 is equal to 42.
    iii. var_dump(‘042’ === 42); will output bool(false) because the === operator performs a stricter comparison and will not coerce the integer into a string.


  • Q

    Explain why the two code snippets below will evaluate to the same output.


    $x = true or false; $x = true and false;
    var_dump($x); var_dump($x);

    This question is designed to test a coder’s knowledge of the order of operations. The first block of code is more straightforward, evaluating to true because of the “or” operator. The second code block, however, would typically be expected to evaluate to false. Instead, it evaluates to true because of how the PHP interpreter handles the order of operations: “=” is prioritized leading to the following equivalent code snippet:

    $x = true; // sets $x equal to true
    True and false; // evaluates to false, but does not affect anything


  • Q

    If $x = 100 + “25%” + “$40” what is the value of $x and why?


    The answer is $x = 125, because PHP uses automatic type conversion in deciding how to treat variables and values depending on how they are used. When PHP encounters a string during an arithmetic operation, it will interpret any numerical value and ignore the remainder in order from left to right. Strings that don’t start with numbers are evaluated to zero.

    $x = 100 + 25 + 0 = 125.


  • Q

    Explain the difference between classes and interfaces.


    In layman’s terms, an interface is a class without all the business logic. In an interface, all methods must be public and multiple inheritance is supported. However, all methods must be defined within the class that implements them. Abstract classes, on the other hand, can be declared with modifiers like public or internal, and can define properties or variables. Abstract classes do not support multiple inheritance and can only be extended by one abstract class.


  • Q

    Predict the output of the code below. Explain your answer.


    $x = 2
    $y = 4
    $z = 6
    if($z > $y > $x) {
        echo “true”;
        echo “false”;

    At first glance, one would expect the boolean to evaluate to “true” because 6 > 4 > 2. However, the correct answer is “false” because PHP will first evaluate $z > $y, which returns a boolean value of 1 or true. It is this boolean value of 1 that is compared to the next integer in the chain, bool(1) > $z, which will result in NULL and echo “false.”


Top 10 web development trends in 2017


Artificial intelligence programs are already used successfully by Google and Wikipedia, the technology is more than within our grasp to allow us to develop software which can think and act as a human without requiring the manpower. One of their most prolific uses already is for web design programs, such as The Grid, which allows amateurs to produce some pretty slick websites by using an artificial intelligence program named Molly.


The reason we believe that the popularity of static site generators keeps going up is simple. Static site generators are a great way to create websites. You don’t need a database, instead your web pages are simple files which run on your servers. With that comes advantages in website loading times, better security handling, and ease of deployment.


Bots are there to make our life easier and our experiences more personable (or at least they should). Bots are interesting from various standpoints and use and development of conversational UI will become an important topic for developers in 2017. JAVASCRIPT IN 2017 It is by far the most popular technology used by full stack developers.


With 36% (or 2382 votes) you stated that this was the most important development trend in 2016. The newest version of Motion UI works through flexible CSS patterns with all kinds of. Real time notification This used to only be embraced by chat applications. It not the case anymore, even revenue visualization dashboards need to update in real-time.This has been necessitated by the fact that most applications in 2017 support multiple point access, so the other party needs to know what’s currently the state of things before they make decisions.

Modular Design

There are a lot of libraries and frameworks both for the front end and back end that ensure that the components of an application are not completely tied into one another.

Live Support

Even a blog nowadays has that little form at the bottom right corner labeled Chat with us! More businesses are throwing their weight behind the need for live interaction as opposed to back and forth email communication with potential customers in 2017.The good this is that there are already a handful of companies offering this service through copy/paste so you wont have to build it ground up in most cases as a web developer – unless for some reason your client/company requires you to.

Single Page Application Design

If you submit a login form today and you have to wait for another 10 seconds for the page to reload then it comes with the message, “Invalid password!” you pretty much start getting irritated, right? Yes, because a lot of this stuff can be done when you are on the same without reloading or taking you to another page. It just saves times and serves for a greater user experience..

HTML compression

It is not just about HTML. JavaScript and CSS are also being compression but this practice has been around for close to a decade or even more. Web developers in 2017 are really looking into what options they have with HTML compression libraries. Also remember a couple of points like :

• Javascript is the future. People are going away from tight integration of server-side code for generating html.

• JQuery will be out of market soon. It is going to be interesting to see how legacy code will be handled on the way.

• ES6 Component based, and class like javascript is providing a new paradigm to the way we see front end development.

Clean Code Concepts Adapted for PHP

Clean Code PHP (jupeter/clean-code-php), is a guide based on the book Clean Code: A Handbook of Agile Software Craftmanship, a classic programming book about writing maintainable code by Uncle Bob Martin.

The clean-code-php guide is inspired by a JavaScript adaptation, clean-code-javascript with PHP-specific features.

Here are a few of my favorite adaptations from the clean-code-php repository:

Don’t add unneeded context



class Car
    public $carMake;
    public $carModel;
    public $carColor;




class Car
    public $make;
    public $model;
    public $color;


View Don’t add unneeded context in the guide.

Function Arguments (2 or fewer ideally)



function createMenu($title, $body, $buttonText, $cancellable) {
    // ...



class MenuConfig
    public $title;
    public $body;
    public $buttonText;
    public $cancellable = false;

$config = new MenuConfig();
$config->title = 'Foo';
$config->body = 'Bar';
$config->buttonText = 'Baz';
$config->cancellable = true;

function createMenu(MenuConfig $config) {
    // ...

View Function Arguments in the guide.

Functions Should Do One Thing



function emailClients($clients) {
    foreach ($clients as $client) {
        $clientRecord = $db->find($client);
        if ($clientRecord->isActive()) {


function emailClients($clients) {
    $activeClients = activeClients($clients);
    array_walk($activeClients, 'email');

function activeClients($clients) {
    return array_filter($clients, 'isClientActive');

function isClientActive($client) {
    $clientRecord = $db->find($client);
    return $clientRecord->isActive();

View View Functions Should Do One Thing in the guide.

Opinions, Opinions, Opinions

The author outlines the following about the purpose of the guide:

Not every principle herein has to be strictly followed, and even fewer will be universally agreed upon. These are guidelines and nothing more, but they are ones codified over many years of collective experience by the authors of Clean Code.

In a dynamic language like PHP (or any language for that matter), developers will disagree with some (or many) of the points made about the concepts demonstrated. I think the point I’d make is not to write off all ideas contained in the guide if you disagree with one or more ideas.

Learn More about Clean Code

I highly recommend that you read the Clean Code book to get a deeper understanding of the guidelines demonstrated in the PHP adaptation. On its own, the PHP guide is a good read, but part of the journey is learning how to spot code that needs some work and then adapting it.

Another great book related to Clean Code, is The Clean Coder: A Code of Conduct for Professional Programmers which focuses on you, the coder. In my opinion, these two books should be a must-read for programmers of any experience level looking to improve their code craftsmanship.

RFS: the automated approach for responsive font sizes

Mastering responsive font sizes for websites has never been easy. Especially for bigger font sizes, multiple breakpoints were needed to gain a little control over the behaviour on all screen sizes. Some improvements were made when calc-functions were introduced to calculate a font size, but still there was no automated way to control all your font sizes for all possible screen widths. That has now changed.

RFS to the rescue

RFS is a SCSS-mixin which generates the responsive css for you.

RFS stands for Responsive Font-Size, easy to remember, easy to use. It’s a desktop-first approach which automatically calculates the correct font size for every screen width. Desktop-first approach means you just have got to define your font-size for big screens and the font size will automatically decrease for smaller ones.

The main advantages of using RFS

  • Font sizes will rescale for every screen width, this prevents long words from being chopped off the screen
  • Super easy to use, no need to define complex configurations for each font-size
  • Font sizes of all text elements will always remain in relation with each other
  • Rem-based font sizes will allow the user to change his default font size in his browser. People with limited vision can therefore increase their font size to increase readability.

With or without RFS

In the example below, you’ll see the difference between a website with and without RFS. The on the left image shows the default bootstrap implementation. In this case smaller words are used (Hello world), but in real life we commonly come across longer words which would be chopped off of the screen. Using RFS, all text elements are scaled correctly, which prevents unwanted behaviour.

Without RFS With RFS
 without-rfs-1.png  with-rfs-1.png

Video-demo of the problem and RFS’s solution

In the first part this video shows the default bootstrap implementation, in the second part RFS takes care of the responsive rescaling of the text.

How does it work?

RFS splits the calculation of the font-size in 2:

  • 1 static font size for bigger screens
  • 1 adaptive font size which decreases along with the screen width of your browser. This font size is calculated in a media query with css’s calc-function.

There are some configuration variables which can influence the font size’s decreasing.

To the code

This input (SCSS):

.title {
@include rfs(60);


Will generate this (CSS):

.title {
font-size: 3.75rem;

@media (max-width: 1200px) {
.title {
font-size: calc(1.35rem + 3.2vw);

Further on, we will explain how these numbers are calculated.

Visualisation of RFS

Everything is easier to grasp when you can visualize it. This is what RFS’s default configuration looks like:


The configuration in detail

There are configuration variables which influence the calculation of the font size. All variables must be set unitless in the configuration:

  • $rfs-minimum-font-size: (in px)
    Font sizes which are calculated by RFS will never be lower than this size.
    However, you can still pass a smaller font size to RFS, but then RFS won’t dynamically scale this font size. For example (see graph above): rfs(17) will trigger dynamic rescaling,  with rfs(10) it will just stay 10px all the time.
    Default value: 12
  • $rfs-minimum-font-size-unit: (string)
    The font size will be rendered in this unit. Possible units are px and rem. This setting doesn’t influence $rfs-minimum-font-size, which will always be configured in px.
    Default value: rem
  • $rfs-breakpoint: (in px)
    This where dynamic rescaling begins. Above this breakpoint, the font size will be equal to the font size you passed to the mixin.
    Default value: 1200
  • $rfs-breakpoint-unit: (string)
    The width of $rfs-breakpoint will be rendered in this unit. Possible units are pxem and rem. This setting doesn’t influence $rfs-breakpoint, which will always be configured in px.
    Default value: px
  • $rfs-factor: (number)
    This is the more complex part. If the font sizes would all resize to the same value when the screen width would be 0, there wouldn’t be a lot of difference between the font sizes on small screens. To prevent this, we brought the $rfs-factor to life.
    Let’s take an example from the graph above: The font size rfs(47) at a screen of 0px is 19px and not 16px because of this factor. This minimum font size is calculated like this:

    Calculate the difference between the font-size (47) and $rfs-minimum-font-size (12)

    47 – 12 = 35
    Divide this number by the $rfs-factor (5)
    35 / 5 = 7
    Add this number to $rfs-minimum-font-size (12)
    7 + 12 = 19

    The higher $rfs-factor, the less difference there is between font sizes on small screens. The lower $rfs-factor, the less influence RFS has, which results in bigger font sizes for small screens. If $rfs-factor is set to 1, there wouldn’t be any difference at all. 1 is the lowest possible value.
    Default value: 5

The calculation of RFS

Let’s take back our example of rfs(60). We use the default configuration:

  • $rfs-minimum-font-size: 12
  • $rfs-minimum-font-size-unit: rem
  • $rfs-breakpoint: 1200
  • $rfs-breakpoint-unit: px
  • $rfs-factor: 5


.title {
@include rfs(60);

The first part of the generated css is pretty straightforward, because $rfs-minimum-font-size-unit is rem, font-size is displayed in rem (60/16=3.75):

.title {
font-size: 3.75rem;

Now let’s have a look at the second part. $rfs-breakpoint is 1200px and it is rendered in px because $rfs-breakpoint-unit is px:

@media (max-width: 1200px) {
.title {
font-size: calc(1.35rem + 3.2vw);

We can calculate 1.35rem the same way we did above when explaining $rfs-factor.

Calculate the difference between the passed font-size (60) and $rfs-minimum-font-size (12)
60 – 12 = 48

Divide this number by the $rfs-factor (5)
48 / 5 = 9.6

Add this number to $rfs-minimum-font-size (12)
9.6 + 12 = 21.6

Convert this number to rem
21.6 / 16 = 1.35

Now we have a font size of 1.35rem or 21.6px below 1200px. Between a screen width of 0px and 1200px, we use vw-units to increase the font size:

Calculate the difference between the font-size at 0px and 1200px
60 – 21.6 = 38.4

Those 38.4px need to be added over 1200px
38.4 / 1200 = 0.032

The screen width = 100vw, so this number needs to be multiplied by 100
0.032 * 100 = 3.2

Tada! Now you have everything you need to construct the second part.


We’ve set up a Codepen demo where you can test RFS and play with the configuration at: However, if you want to test an entire website, check out the Bootstrap-version:

View the bootstrap-demo with RFS

Let’s put it in bootstrap by default!

There is a feature request pending to implement RFS by default in Bootstrap. Put those thumbs up if you would like this feature to be implemented here:

Download on github

Download the RFS-mixin here:


Let us know if you have any questions or suggestions. Just tweet to @Martijn_Cuppens.