博客列表 >0906- 细说命名空间

0906- 细说命名空间

3期-Shawn的博客
3期-Shawn的博客原创
2018年09月07日 17:39:06780浏览

1.编程: 用大括号语法实现在一个脚本中创建多个命名空间并访问成员

0906zuoye1.png

实例

<?php
// 用大括号语法实现在一个脚本中创建多个命名空间并访问成员

//如何让全局代码与用户空间代码和平相处?

//1.全局代码:之前我们是用 \ 进行引用的
//2.用户代码:用 namespace  进行标识
//3.用户自定义命名空间,在空间标识符后有一对花括号代码之前的分号,将属于该空间的代码全部放在花括号内
//4.全局空间的代码,使用一个没有标识符的namespace关键字加花括号即可,将全局代码放在这对没有空间标识符的花括号内


namespace
{
  const app = '我是全局命名空间的常量';
}




//声明一个命名空间one
namespace one
{
  class Demo
  {
    public $name = 'Shawn Wang';
    public function demo1()
    {
      return __METHOD__;
    }
  }
  const SITE = 'PHP中文网';
  function add($a,$b)
  {
    return $a+$b;
  }
  echo (new \two\Demo())->name,'<br>';
  echo (new \two\Demo())->demo1(),'<br>';
  echo add(12,88),'<br>';
  echo app,'<br>';//访问全局命名空间下的常量
  echo \two\add(32,88),'<hr>';


  //echo (new \one\Demo())->add(12,88),'<hr>';不明白为何这样会错

}

//声明一个命名空间two
namespace two
{
  class Demo
  {
    public $name = '王先生';
    public function demo1()
    {
      return __METHOD__;
    }
  }
  const SITE = 'www.php.cn';
  function add($a,$b)
  {
    return $a+$b;
  }
  echo (new \one\Demo())->name,'<br>';
  echo (new \one\Demo())->demo1(),'<br>';
  echo add(32,88),'<br>';
  echo \one\add(32,88),'<hr>';
}

//如果执行one空间中的代码
//echo (new \one\Demo())->name,'<br>';
//这样可以吗?貌似可以,但实际不行的
//原因是:如果当前脚本使用了命名空间,那么里面的全部代码都必须使用命名空间进行声明和访问


//声明一个命名空间three
namespace three
{
  echo (new \one\Demo())->name,'<br>';
  echo (new \two\Demo())->name,'<hr>';


}

//声明一个全局空间
namespace {

    echo (new one\Demo())->name,'<br>';
    echo (new \two\Demo())->name,'<hr>';
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

2.编程:使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问

0906zuoye2.png

实例

<?php
//使用use 导入其它脚本中的类/常量/函数,并使用别名方式访问

//使用别名导入命名空间
//use关键字的使用


//1. 声明一个命名空间one
namespace one;

//use one\two\three\Demo;
//如果当前类也有一个同名的Demo类,怎么办?为导入的类取一个别名
use one\two\three\Demo as Demo1;

class Demo
{
  public $name='Shawn Wang';
}

const SITE='PHP中文网';

function add($a,$b)
{
  return $a+$b;
}

//在当前空间访问: one\two\three空间中类,必须要添加很长的空间前缀
//echo (new one\two\three\Demo)->name;
echo (new Demo)->name;
echo (new Demo1)->name,'<hr>';



//2.声明命名空间:one\two\three
namespace one\two\three;

class Demo
{
  public $name='';
}

const  DOMAIN = 'www.php.cn';


function add($a,$b)
{
  return $a+$b;
}


namespace test1;
require 'test2.php';
use test2\Test2;//导入类,类的别名默认为Test2。与当前命名空间类名有冲突的话用as


class Test1
{
  public static function demo()
  {
    return __METHOD__;
  }
}


echo Test1::demo(),'<hr>';
echo \test2\Test2::demo(),'<hr>';
echo Test2::demo(),'<hr>';

运行实例 »

点击 "运行实例" 按钮查看在线实例

3. 问答: 非限定名称,限定名称和完全限定名称的命名空间之间的区别与联系是什么?

非限定命名称的命名空间:               即当前所在的命名空间

限定名称的命名空间:                      即使用命名空间前缀的命名空间

完全限定名称的命名空间:               即使用命名空间前缀的命名空间,且命名空间前缀是以根空间(全局空间)开始的

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议