Free PHP course. Sign Up for tracking progress →

PHP: Magic numbers

Let's remember one of the previous lessons:

<?php

$eurosCount = 1000;
$dollarsCount = $eurosCount * 1.25; // 1250
$rublesCount = $dollarsCount * 60;  // 75000

print_r($rublesCount);

From the developer's point of view, such code "smells". This describes code that doesn't conform to so-called best practices. And here's the reason. If you're looking at the numbers 60 and 1.25, you'll probably be wondering, "What are those numbers? Imagine reading a month from now! How could a new programmer who hasn't seen the code before understand it? In our example, the context is restored through proper naming, but real life code is much more complicated, and therefore it's often impossible to guess the meaning of the numbers.

This "smell" is caused by magic numbers. They're numbers that you can't explain the origin of, unless you dig deeper into the code.

The way out is simple: just create variables with the right names and everything will be as they need to be.

<?php

$dollarsPerEuro = 1.25;
$rublesPerDollar = 60;

$eurosCount = 1000;
$dollarsCount = $eurosCount * $dollarsPerEuro;   // 1250
$rublesCount = $dollarsCount * $rublesPerDollar; // 75000

print_r($rublesCount);

Note the following details:

  • lowerCamelCase naming
  • The two new variables are separated from the following computations by an empty string. These variables are meaningful even without any computation involved, which is why separating them here is good, it makes it easier to read.
  • The code is well named and structured, but it's longer than the previous version. This is often the case, but it's fine, because the code needs to be readable.

Instructions

You've come across this code, which prints the total number of rooms owned by the present king:

<?php

$king = 'King Balon the 6th';
print_r($king . ' has ' . (6 * 17) . ' rooms.');

As you can see, there are some magic numbers here: it's unclear what 6 is and what 17 is. If you know the history of the royal family, you can guess: each new king inherits all his ancestors' castles and builds a new one, an exact copy of his parents'.

This strange dynasty simply breeds identical castles…

Get rid of the magic numbers by creating new variables and then displaying the text on the screen.

You'll get this:

King Balon the 6th has 102 rooms.

Variable names should convey the meaning of numbers, but should remain short and succinct enough to be easily read.

Note: The code will work with any name, and we only check the printed result, so the task is up to you.

The exercise doesn't pass checking. What to do? 😶

If you've reached a deadlock it's time to ask your question in the «Discussions». How ask a question correctly:

  • Be sure to attach the test output, without it it's almost impossible to figure out what went wrong, even if you show your code. It's complicated for developers to execute code in their heads, but having a mistake before their eyes most probably will be helpful.
In my environment the code works, but not here 🤨

Tests are designed so that they test the solution in different ways and against different data. Often the solution works with one kind of input data but doesn't work with others. Check the «Tests» tab to figure this out, you can find hints at the error output.

My code is different from the teacher's one 🤔

It's fine. 🙆 One task in programming can be solved in many different ways. If your code passed all tests, it complies with the task conditions.

In some rare cases, the solution may be adjusted to the tests, but this can be seen immediately.

I've read the lessons but nothing is clear 🙄

It's hard to make educational materials that will suit everyone. We do our best but there is always something to improve. If you see a material that is not clear to you, describe the problem in “Discussions”. It will be great if you'll write unclear points in the question form. Usually, we need a few days for corrections.

By the way, you can participate in courses improvement. There is a link below to the lessons course code which you can edit right in your browser.