Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is type hinting necessary in PHP?

I am having trouble wrapping my head around the importance of Type hinting in PHP.

Apparently 'type hinting' in PHP can be defined as follows:

"Type hinting" forces you to only pass objects of a particular type. This prevents you from passing incompatible values, and creates a standard if you're working with a team etc.

So type hinting at the most basic level, is not required to actually make the code work?

I have the following code to try and understand what is going on...

Index.php

<?php include 'Song.php';  $song_object = new Song;  $song_object->title = "Beat it!"; $song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";   function sing(Song $song) {     echo "Singing the song called " . $song->title;     echo "<p>" . $song->lyrics . "</p>"; }  sing($song_object); 

Song.php

<?php  class Song {     public $title;     public $lyrics; } 

the code does its thing with or without the little type hint in the function sing();

enter image description here

So, this leads me to believe that type hinting is simply a coding convention to make sure only certain classes are used and are not needed to produce functional code, is this correct?

Type hinting, as the quote above suggests, is there to create a standard if you're working with a team.

Am I missing something here?

like image 579
Jethro Hazelhurst Avatar asked Jul 11 '16 14:07

Jethro Hazelhurst


People also ask

What is type hinting in PHP?

The PHP Type Hinting works for only some type of data. For functions arg/argument, the user will specify some user-defined class instance and it will be hinted by the class name. It works after the PHP 5 version.

Is PHP still a weakly-typed language?

While PHP is still a “weakly-typed” language (meaning variables can change types throughout the program’s lifecycle), PHP 7.0 sought to give developers more control over how they specify function inputs and outputs in two ways: type hinting and return types.

What is type type hinting in C++?

Type hinting is a concept that provides hints to function for the expected data type of arguments. For example, If we want to add an integer while writing the add function, we had mentioned the data type (integer in this case) of the parameter.

What is the difference between type hinting and return typing?

While type hinting allows you to specify a function’s input variable types, return typing allow you to specify a function’s output variable type. Let’s look at our string to integer converter:


2 Answers

Type hinting isn't required, but it can allow you to catch certain types of mistakes. For example, you might have a function or method which requires an integer. PHP will happily convert "number looking strings" into integers, and this can cause hard to debug behaviour. If you specify in your code that you specifically need an integer, this can prevent those kinds of bugs in the first place. Many programmers consider protecting their code in this way to be a best practice.

As a concrete example of this in action, let's look at an updated version of your index.php file:

index.php

<?php include 'Song.php'; include 'Test.php';  $song_object = new Song; $test_object = new Test;  $song_object->title = "Beat it!"; $song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";  $test_object->title = "Test it!"; $test_object->lyrics = "It doesn't matter who's wrong or right... just test it!";   function sing(Song $song) {     echo "Singing the song called " . $song->title;     echo "<p>" . $song->lyrics . "</p>"; }  sing($song_object); sing($test_object); 

As well as the new Test.php file I added:

Test.php

<?php  class Test {     public $title;     public $lyrics; } 

When I run index.php now, I get the following error:

Output:

Singing the song called Beat it!<p>It doesn't matter who's wrong or right... just beat it!</p>PHP Catchable fatal error:  Argument 1 passed to sing() must be an instance of Song, instance of Test given, called in test/index.php on line 22 and defined in test/index.php on line 15  Catchable fatal error: Argument 1 passed to sing() must be an instance of Song, instance of Test given, called in test/index.php on line 22 and defined in test/index.php on line 15 

This is PHP letting me know that I tried to use the wrong type of class when I called the sing() function.

This is useful because, even though the above example worked, the Test class could be different than the Song class. This could lead to hard to debug errors later on. Using hinting in this way gives developers a way to prevent type errors before they cause issues. This is especially useful in a language like PHP which is often eager to auto-convert between types.

like image 181
Gavin Anderegg Avatar answered Sep 21 '22 00:09

Gavin Anderegg


Type hinting is a natural process. At first it may seem like extra work but it is very helpful as your project grows in PHP. It allows for better readability and makes error control and strict programming conventions easier to apply.

Initially, you must implement the ‘contract’, where the contract is a php interface which can ‘lock’ constants and the key public methods and their arguments, as such:

interface SongInterface {     //... }  class Song implements SongInterface {     public $title;     public $lyrics;     //... } 

Then continue with the actual execution part:

$song = (object) new Song;  $song->title = (string) "Beat it!"; $song->lyrics = (string) "It doesn't matter who's wrong or right... just beat it!";   function sing(SongInterface $song): string {     $html = (string)  "Singing the song called " . $song->title     . "<p>" . $song->lyrics . "</p>";      return htmlentities($html, ENT_QUOTES, 'utf-8'); }  echo sing($song); 

Using an interface, you only define the functions and then implement it in a song class. This way you can always inject another song class (with newer functionalities and changes) without breaking your application. Check out oop interfaces: http://php.net/manual/en/language.oop5.interfaces.php

Since php7, you can also define the return type of a function. https://wiki.php.net/rfc/return_types

like image 34
Nitin Avatar answered Sep 20 '22 00:09

Nitin