What is PHP Namespace(s)? What is Namespaces in general? A Layman answer with an Example would be great.
Thank you in advance ;-)
What is PHP Namespace(s)? What is Namespaces in general? A Layman answer with an Example would be great.
Thank you in advance ;-)
There are techniques like namespaces in other programming languages (like packages in Java). They are used to be able to have mutliple classes with the same name wihtin a project.
From the php documentation (http://www.php.net/manual/en/language.namespaces.rationale.php):
What are namespaces? In the broadest definition namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places. For example, in any operating system directories serve to group related files, and act as a namespace for the files within them. As a concrete example, the file foo.txt can exist in both directory /home/greg and in /home/other, but two copies of foo.txt cannot co-exist in the same directory. In addition, to access the foo.txt file outside of the /home/greg directory, we must prepend the directory name to the file name using the directory separator to get /home/greg/foo.txt. This same principle extends to namespaces in the programming world.
A namespace allows you to place a bunch of code under a name and not have any naming conflicts with classes, functions and constants.
It allows your code to live in that namespace.
PHP uses the somewhat controversial character \
to show namespace levels. People got up in arms because it is also used as an escape character.
To use the namespace in PHP, use something like this at the top of your file.
namespace my\namespace;
You can find a lot more information on the official PHP documentation for namespaces.
A Namespace works like a directory. You know how you can put files in a directory with the same names as files in the parent (or any other) directory? Well, a namespace lets you do that within an application for variables, functions and classes.
There was a bit of a trend in PHP a little while ago for huge classes of static functions. The only way to call any of those functions was by prefixing a call with the class name. This was a primitive attempt at namespaces, but with not very much of the benefits.
A namespace basically lets you put code into a container. This will prevent problems with two functions (as well as classes and variables) that share the same name.
These are useful when working when larger applications to prevent issues with pieces of code sharing the same name.
For example, lets say we wanted two functions called "TheMessage" . These both would print (echo) different messages each. Normally, this would cause a syntax error, as you cannot have two functions that share the same name.
To fix this, you could put these functions into separate namespaces. This would allow you to use both functions without any errors.
Namespacing does for functions and classes what scope does for variables. It allows you to use the same function or class name in different parts of the same program without causing a name collision.
In simple terms, think of a namespace as a person's surname. If there are two people named "John" you can use their surnames to tell them apart.
Suppose you write an application that uses a function named output()
. Your output()
function takes all of the HTML code on your page and sends it to the user.
Later on your application gets bigger and you want to add new features. You add a library that allows you to generate RSS feeds. This library also uses a function named output()
to output the final feed.
When you call output()
, how does PHP know whether to use your output()
function or the RSS library's output()
function? It doesn't. Unless you're using namespaces.
How do we solve having two output()
functions? Simple. We stick each output()
function in its own namespace.
That would look something like this:
namespace MyProject;
function output() {
# Output HTML page
echo 'HTML!';
}
namespace RSSLibrary;
function output(){
# Output RSS feed
echo 'RSS!';
}
Later when we want to use the different functions, we'd use:
\MyProject\output();
\RSSLibrary\output();
Or we can declare that we're in one of the namespaces and then we can just call that namespace's output()
:
namespace MyProject;
output(); # Output HTML page
\RSSLibrary\output();
If we didn't have namespaces we'd have to (potentially) change a lot of code any time we added a library, or come up with tedious prefixes to make our function names unique. With namespaces, we can avoid the headache of naming collisions when mixing third-party code with our own projects.