批改状态:合格
老师批语:
1.编程: 用大括号语法实现在一个脚本中创建多个命名空间并访问成员

<?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 导入其它脚本中的类/常量/函数,并使用别名方式访问

<?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. 问答: 非限定名称,限定名称和完全限定名称的命名空间之间的区别与联系是什么?
非限定命名称的命名空间: 即当前所在的命名空间
限定名称的命名空间: 即使用命名空间前缀的命名空间
完全限定名称的命名空间: 即使用命名空间前缀的命名空间,且命名空间前缀是以根空间(全局空间)开始的
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号