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:
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.
If you've reached a deadlock it's time to ask your question in the «Discussions». How ask a question correctly:
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.
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.
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.
Your exercise will be checked with these tests:
1<?php // phpcs:ignore PSR1.Files.SideEffects
2
3namespace HexletBasics\Variables\MagicNumbers;
4
5use PHPUnit\Framework\TestCase;
6
7\HexletBasics\Functions\runScript();
8
9class Test extends TestCase
10{
11 public function test()
12 {
13 $expected = 'King Balon the 6th has 102 rooms.';
14 $this->expectOutputString($expected);
15 require 'index.php';
16 }
17}
18
Teacher's solution will be available in: