{"id":600,"date":"2021-03-23T03:08:11","date_gmt":"2021-03-23T03:08:11","guid":{"rendered":"https:\/\/phptutorial.net\/?page_id=600"},"modified":"2021-07-12T07:14:20","modified_gmt":"2021-07-12T07:14:20","slug":"php-namespace","status":"publish","type":"page","link":"https:\/\/www.phptutorial.net\/php-oop\/php-namespace\/","title":{"rendered":"PHP Namespace"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about PHP namespaces, how to define classes that belong to a namespace, and how to use namespaces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='why-namespaces'>Why namespaces <a href=\"#why-namespaces\" class=\"anchor\" id=\"why-namespaces\" title=\"Anchor for Why namespaces\">#<\/a><\/h2>\n\n\n\n<p>When your project grows in complexity, you&#8217;ll need to integrate the code from others. Sooner or later, you&#8217;ll find that your code has different <a href=\"https:\/\/phptutorial.net\/php-oop\/php-objects\/\">classes<\/a> with the same name. This problem is known as <strong>name collision<\/strong>.<\/p>\n\n\n\n<p>To resolve it, you can use namespaces. PHP supported namespaces since version 5.3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='what-is-a-namespace'>What is a namespace <a href=\"#what-is-a-namespace\" class=\"anchor\" id=\"what-is-a-namespace\" title=\"Anchor for What is a namespace\">#<\/a><\/h2>\n\n\n\n<p>It&#8217;s easier to understand namespaces by analogy to the directory structure in a filesystem.<\/p>\n\n\n\n<p>A directory stores related files, which is similar to a namespace that groups related classes.<\/p>\n\n\n\n<p>A directory doesn&#8217;t allow you to have two files with the same name. However, you can have files with the same names in different directories. Likewise, namespaces mimic the same principle.<\/p>\n\n\n\n<p>By definition, namespaces provide you with a way to group related classes and help you avoid any potential name collisions.<\/p>\n\n\n\n<p>Namespaces are not limited to group classes. They can group other identifiers, including <a href=\"https:\/\/phptutorial.net\/php-tutorial\/php-functions\/\">functions<\/a>, <a href=\"https:\/\/phptutorial.net\/php-tutorial\/php-constants\/\">constants<\/a>, <a href=\"https:\/\/phptutorial.net\/php-tutorial\/php-variable-variables\/\">variables<\/a>, etc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='set-up-a-directory-structure'>Set up a directory structure <a href=\"#set-up-a-directory-structure\" class=\"anchor\" id=\"set-up-a-directory-structure\" title=\"Anchor for Set up a directory structure\">#<\/a><\/h2>\n\n\n\n<p>First, create a project directory, e.g., <code>store<\/code> and create a new <code>index.php<\/code> file in the directory.<\/p>\n\n\n\n<p>Second, create <code>src<\/code> directory in the project directory and <code>Model<\/code> directory in the <code>src<\/code> directory.<\/p>\n\n\n\n<p>Third, create a new file called <code>Customer.php<\/code> in the <code>Model<\/code> directory with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Customer<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">private<\/span> $name;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">($name)<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;name = $name;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getName<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;name;\n    }\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The directory looks like the following:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 index.php\n\u2514\u2500\u2500 src\n    \u2514\u2500\u2500 Model\n        \u2514\u2500\u2500 Customer.php<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='define-a-namespace'>Define a namespace <a href=\"#define-a-namespace\" class=\"anchor\" id=\"define-a-namespace\" title=\"Anchor for Define a namespace\">#<\/a><\/h2>\n\n\n\n<p>To define a namespace, you place the <code>namespace<\/code> keyword followed by a name at the very top of the page. The following example gives the <code>Customer<\/code> class with a namespace <code>Store\\Model<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Customer<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">private<\/span> $name;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">($name)<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;name = $name;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getName<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;name;\n    }\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\"><li>It&#8217;s customary to assign the <code>src<\/code> directory the <code>Store<\/code> namespace. And you can replace <code>Store<\/code> with your brand name, e.g., Apple.<\/li><li>It&#8217;s a good practice to imitate the directory structure with the namespace to find classes more easily. For example, every class within the directory will get the namespace <code>Store\\Model<\/code>.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id='use-a-class-that-belongs-to-a-namespace'>Use a class that belongs to a namespace <a href=\"#use-a-class-that-belongs-to-a-namespace\" class=\"anchor\" id=\"use-a-class-that-belongs-to-a-namespace\" title=\"Anchor for Use a class that belongs to a namespace\">#<\/a><\/h2>\n\n\n\n<p>To use a class that belongs to a namespace in the <code>index.php<\/code>, you need to include the file and use the class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you open the <code>index.php<\/code>, you&#8217;ll get a fatal error:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Fatal error: Uncaught <span class=\"hljs-built_in\">Error<\/span>: Class <span class=\"hljs-string\">'Customer'<\/span> not found <span class=\"hljs-keyword\">in<\/span>...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Since the <code>Customer<\/code> class now is namespaced, you need to use the fully qualified name that includes the namespace like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Store\\Model\\Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now, it should work properly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='import-a-namespace'>Import a namespace <a href=\"#import-a-namespace\" class=\"anchor\" id=\"import-a-namespace\" title=\"Anchor for Import a namespace\">#<\/a><\/h2>\n\n\n\n<p>To avoid using the fully qualified names from a namespace, you can import the namespace with the <code>use<\/code> operator like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>;\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Model\\Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now, you just need to prefix the class name with <code>Model<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='import-a-class-from-a-namespace'>Import a class from a namespace <a href=\"#import-a-class-from-a-namespace\" class=\"anchor\" id=\"import-a-class-from-a-namespace\" title=\"Anchor for Import a class from a namespace\">#<\/a><\/h2>\n\n\n\n<p>PHP allows you to import a class from a namespace instead of importing the namespace. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>\\<span class=\"hljs-title\">Customer<\/span>;\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this example, we use the <code>use<\/code> operator to import the <code>Customer<\/code> class from the <code>Store\\Model<\/code> namespace. Therefore, we don&#8217;t have to prefix the class name with the namespace.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='import-multiple-classes-from-a-namespace'>Import multiple classes from a namespace <a href=\"#import-multiple-classes-from-a-namespace\" class=\"anchor\" id=\"import-multiple-classes-from-a-namespace\" title=\"Anchor for Import multiple classes from a namespace\">#<\/a><\/h2>\n\n\n\n<p>First, create a new file called <code>Product.php<\/code> in the <code>src\/Model<\/code> directory:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Product<\/span>\n<\/span>{\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For demonstration purposes, the <code>Product<\/code> class is empty. Now, the directory structure looks like the following:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 index.php\n\u2514\u2500\u2500 src\n    \u2514\u2500\u2500 Model\n        \u251c\u2500\u2500 Customer.php\n        \u2514\u2500\u2500 Product.php<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To use both <code>Customer<\/code> and <code>Product<\/code> classes from the <code>index.php<\/code>, you can import them individually like before:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Product.php'<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>\\<span class=\"hljs-title\">Customer<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>\\<span class=\"hljs-title\">Product<\/span>;\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();\n\n$product = <span class=\"hljs-keyword\">new<\/span> Product();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>When the number of imported classes grows, your code will become more verbose. So instead of importing each individual class, you can import all the classes using a single statement:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">namespace<\/span>\\{<span class=\"hljs-title\">className1<\/span>, <span class=\"hljs-title\">className2<\/span>, ...}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Customer.php'<\/span>;\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Model\/Product.php'<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Model<\/span>\\{<span class=\"hljs-title\">Customer<\/span>, <span class=\"hljs-title\">Product<\/span>};\n\n$customer = <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-string\">'Bob'<\/span>);\n\n<span class=\"hljs-keyword\">echo<\/span> $customer-&gt;getName();\n\n$product = <span class=\"hljs-keyword\">new<\/span> Product();<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='alias-classes-from-a-namespace'>Alias classes from a namespace <a href=\"#alias-classes-from-a-namespace\" class=\"anchor\" id=\"alias-classes-from-a-namespace\" title=\"Anchor for Alias classes from a namespace\">#<\/a><\/h2>\n\n\n\n<p>First, create a new directory called <code>Database<\/code> under the project directory and place a new file <code>Logger.php<\/code> in the <code>Database<\/code> directory with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Database<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">($message)<\/span>\n    <\/span>{\n        var_dump(<span class=\"hljs-string\">'Log '<\/span> . $message . <span class=\"hljs-string\">' to the database.'<\/span>);\n    }\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, create a new directory <code>Utils<\/code> under the project directory and create a new Logger.php in the <code>Utils<\/code> directory.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Utils<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">($message)<\/span>\n    <\/span>{\n        var_dump(<span class=\"hljs-string\">'Log '<\/span> . $message);\n    }\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now, you have two classes with the same name in different namespaces:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 index.php\n\u2514\u2500\u2500 src\n    \u251c\u2500\u2500 Database\n    \u2502   \u2514\u2500\u2500 Logger.php\n    \u251c\u2500\u2500 Model\n    \u2502   \u251c\u2500\u2500 Customer.php\n    \u2502   \u2514\u2500\u2500 Product.php\n    \u2514\u2500\u2500 Utils\n        \u2514\u2500\u2500 Logger.php<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, import <code>Logger<\/code> classes from both namespaces <code>Store\\Utils<\/code> and <code>Database\\Logger<\/code> into the <code>index.php<\/code> file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Utils\/Logger.php'<\/span>;\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Database\/Logger.php'<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Utils<\/span>\\<span class=\"hljs-title\">Logger<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Database<\/span>\\<span class=\"hljs-title\">Logger<\/span>;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>PHP raises the following error:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Fatal error: Cannot use Store\\Database\\Logger as Logger because the name is already in use in...<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To avoid this, you can just import the namespaces:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Utils\/Logger.php'<\/span>;\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Database\/Logger.php'<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Utils<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Database<\/span>;\n\n$loggers = &#91;\n    <span class=\"hljs-keyword\">new<\/span> Utils\\Logger(),\n    <span class=\"hljs-keyword\">new<\/span> Database\\Logger()\n];\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Or you can give a class an alias when importing it:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> namespace\\className <span class=\"hljs-keyword\">as<\/span> newClassName;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following example assigns the <code>DatabaseLogger<\/code> class an alias to the <code>Store\\Database\\Logger<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Utils\/Logger.php'<\/span>;\n<span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'src\/Database\/Logger.php'<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Utils<\/span>\\<span class=\"hljs-title\">Logger<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Store<\/span>\\<span class=\"hljs-title\">Database<\/span>\\<span class=\"hljs-title\">Logger<\/span> <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">DatabaseLogger<\/span>;\n\n$loggers = &#91;\n    <span class=\"hljs-keyword\">new<\/span> Logger(),\n    <span class=\"hljs-keyword\">new<\/span> DatabaseLogger()\n];<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='use-classes-from-the-global-namespace'>Use classes from the global namespace <a href=\"#use-classes-from-the-global-namespace\" class=\"anchor\" id=\"use-classes-from-the-global-namespace\" title=\"Anchor for Use classes from the global namespace\">#<\/a><\/h2>\n\n\n\n<p>To use global classes such as built-in classes or user-defined classes without a namespace, you need to precede the name of such classes with a backslash (<code>\\<\/code>).<\/p>\n\n\n\n<p>The following example shows how to use the built-in DateTime class in the App namespace:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>;\n\n$publish_at = <span class=\"hljs-keyword\">new<\/span> \\DateTime();\n\n<span class=\"hljs-keyword\">echo<\/span> $publish_at-&gt;format(<span class=\"hljs-string\">'Y-m-d H:i:s'<\/span>);<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use a namespace to group related classes.<\/li><li>Mimic the directory structure with the namespaces to make it easier to find the classes.<\/li><li>Use the <code>use<\/code> operator to import a namespace or a class from a namespace.<\/li><li>Use the <code>as<\/code> keyword to assign a namespace or a class of a namespace an alias.<\/li><\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Did you find this tutorial useful?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"600\"\n\t\t\t\tdata-post-url=\"https:\/\/www.phptutorial.net\/php-oop\/php-namespace\/\"\n\t\t\t\tdata-post-title=\"PHP Namespace\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"600\"\n\t\t\t\tdata-post-url=\"https:\/\/www.phptutorial.net\/php-oop\/php-namespace\/\"\n\t\t\t\tdata-post-title=\"PHP Namespace\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn about PHP namespaces, how to define classes that belong to a namespace, and how to use namespaces.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1753,"menu_order":28,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-600","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/comments?post=600"}],"version-history":[{"count":5,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/600\/revisions"}],"predecessor-version":[{"id":2281,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/600\/revisions\/2281"}],"up":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/1753"}],"wp:attachment":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/media?parent=600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}