关于PHP的命名空间,简单粗暴易懂

第一个文件
cat.class.php


namespace Animals\Cat;    

    class Cat
    {
        public function speak()
        {
            echo 'miaow';
        }
    }

    function root(){
        return 'cat.class.php';
    }
?>

第二个文件
dog.class.php


namespace Animals\Dog;    

    class Dog
    {
        public function speak()
        {
            echo 'woof';
        }
    }

    class Cat
    {
        public function speak()
        {
            echo 'miaoth';
        }
    }

    function root(){
        return 'dog.class.php';
    }
?>

index.php
第三个文件,即加载上述命名空间的文件


    namespace Index;
    require_once 'cat.class.php';
    require_once 'dog.class.php';

    use Animals\Cat;
    use Animals\Dog as Snoopi;

    //完全限定名
    $cat1 = new \Animals\Cat\Cat();
    $cat1->speak();
    echo '
'
; $cat2 = new \Animals\Dog\Cat(); $cat2->speak(); echo '
'
; $dog1 = new \Animals\Dog\Dog(); $dog1->speak(); echo '
'
; //非完全限定名 $cat3 = new Cat\Cat(); $cat3->speak(); echo '
'
; //别名 *别名和非完全限定名 不能同时使用 $dog3 = new Snoopi\Dog(); $dog3->speak(); //不止函数,该命名空间下的任何可用资源都可调用[函数、变量、常量等等] echo Snoopi\root(); echo '
'
; ?>

命名空间类可类比于文件目录系统
new 一个命名空间的一个类[或者函数,变量等等]即调用某一目录下文件中的内容
完全限定名 即局对路径寻找找文件中的内容
非完全限定名 即相当于
use 引入命名空间时 把’相对路径’ 赋值给一个变量,该变量默认为最后一段子空间
使用 as 关键字可以设置该变量的名字,该变量即别名,所以别名和非完全限定名不能同时使用(因为一个use[+as] 只能出一个别名)。
类比文件目录系统:
文件位置: /root/path/file/fileContent;
use /root/path/file 即 file=/root/path/filefile file/fileContent
*而index.php 中的namespace Index;相当于指明了当前的文件位置
所以 如果 index.php中的文件内容修改为


    require_once 'cat.class.php';
    require_once 'dog.class.php';

    use Animals\Cat\Cat;#引入该命名空间下的类
    $cat4 = new Cat();
    $cat4->speak();
    root();
 ?>

use 相当于只加载了命名空间Animals\Cat中的Cat类,而root()这个函数并没有’加载’
所以运行会抱一个错误:root()函数未声明

你可能感兴趣的:(PHP)