• PHP面向对象之命名空间


    命名空间

    • 概念
      • 在一个大的项目中,可能会遇到同名的类、函数、常量
      • 为了区分这些元素,我们可以将这些元素分别存放到不同的命名空间中
      • 命名空间就是包,用来存放项目中的类、函数、常量
      • 通过namespace关键字来声明命名空间
    <?php
    namespace China;
    function getInfo(){
    	echo '我是中国人<br>';
    }
    namespace USA;
    function getInfo(){
    	echo 'I am a America<br>';
    }
    getInfo();			//I am a America
    USAgetInfo();		//I am a America
    ChinagetInfo();	//我是中国人
    ?>
    

    多级命名空间

    • 概念

      • 命名空间的名字可以是多级的(子级命名空间)
    • 如果将相对路径转成绝对路径

    公共空间+命名空间+空间元素
    公共空间           命名空间                  空间元素
                ChinaShanghaiPuDong        Student
    
    <?php
    namespace ChinaJiangsuNanjing;
    class Student {
    	public function __construct(){
    		echo '我是中国人!<br>';
    	}
    }
    namespace USAWashington;
    class Student {
    	public function __construct(){
    		echo '我是白皮猪!<br>';
    	}
    }
    $stu1= new Student();							//相对路径
    $stu2= new ChinaJiangsuNanjingStudent();	//绝对路径
    $stu3= new USAWashingtonStudent();			//绝对路径
    ?>
    

    访问空间元素的三种方式

    • 概念
      • 非限定名称访问
      • 完全限定名称访问
      • 限定名称访问
    <?php
    namespace ChinaJiangsuNanjing;
    function getInfo(){
    	echo '南京...<br>';
    }
    namespace ChinaJiangsu;
    function getInfo(){
    	echo '江苏...<br>';
    }
    getInfo();							//非限定名称访问	江苏...			
    ChinaJiangsugetInfo();			//完全限定名称访问	江苏...
    NanjinggetInfo();					//限定名称访问		南京...
    ChinaJiangsuNanjinggetInfo();	//转成绝对路径		南京...
    ?>
    

    引入命名空间

    • 概念

      • 完全限定名称访问元素路径太长
      • 可以将其他空间引入到当前空间来
      • 通过use引入命名空间
    • 语法

      • 公共空间+引入空间+(去除公共部分,公共部分只能有一级)空间元素
    <?php
    namespace ChinaJiangsuNanjing;
    function getInfo(){
    	echo '兴化...<br>';
    }
    namespace USA;
    function getInfo(){
    	echo '江苏...<br>';
    }
    use ChinaJiangsuNanjing;
    getInfo();			//江苏...			
    NanjinggetInfo();	//兴化...
    ?>
    

    引入空间元素

    • 概念
      • 引入类:use
      • 引入函数:use function [php7.0以后支持]
      • 引入常量:use const [php7.0以后支持]
    <?php
    namespace ChinaJiangsuNanjing;
    class Student {
    }
    function getInfo() {
    	echo '韩梅梅<br>';
    }
    const TYPE='学生';
    namespace USA;
    use ChinaJiangsuNanjingStudent;			//引入类
    use function ChinaJiangsuNanjinggetInfo;	//引入函数
    use const ChinaJiangsuNanjingTYPE;		//引入常量
    //测试
    $stu= new Student;
    var_dump($stu);
    echo '<br>';
    getInfo();
    echo TYPE;
    USAgetInfo();	//Call to undefined function USAUSAgetInfo()
    ?>
    

    给类、函数取别名

    • 概念
      • 如果引入的类和函数与当前空间的类和函数名称相同
      • 需要给引入的类和函数取别名
      • 通过as取别名
    <?php
    namespace ChinaJiangsuNanjing;
    class Student {
    	
    }
    function getInfo() {
    	echo '中国人<br>';
    }
    namespace USAWashington;
    class Student {
    	
    }
    function getInfo() {
    	echo '白皮猪<br>';
    }
    //引入类取别名
    use ChinaJiangsuNanjingStudent as ChinaStudent;
    //引入函数
    use function ChinaJiangsuNanjinggetInfo as info1;
    //测试
    $stu= new ChinaStudent;
    var_dump($stu);
    getInfo();	// 白皮猪
    info1();	// 中国人
    ?>
    

    公共空间

    • 概念
      • 如果一个页面没有namespace声明空间
      • 这个页面的元素在公共空间下
      • 公共空间用表示
    <?php
    function getInfo() {
    	echo '中国人<br>';
    }
    getInfo();
    ?>
    

    命名空间注意事项

    • 概念
      • 命名空间只能存放类、函数、const常量
      • 第一个namespace前面不能有任何的代码
        • 空白字符、header()也不行
      • 包含文件不影响当前的命名空间
  • 相关阅读:
    JAVA 8 主要新特性 ----------------(一)总纲
    STARTTLS is required but host does not support STARTTLS
    Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response
    MyBatis-Plus 多库部署方式;spring mvc 多库部署方式
    Mac could not read from remote repository
    IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA sort排序方法使用方式, 添加关联表的 order by
    CentOS7 安装可视化脚本安装包Webmin
    VSCode 设置侧边栏字体大小;Visual Studio Code改变侧边栏大小
    java 开发中经常问到得懒汉模式 (单利模式)
    java 中多线程的同步函数的运用
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14127932.html
Copyright © 2020-2023  润新知