编程题
-1,首先认识什么是全局成员
类,接口,函数,常量
-2,常用的几个魔术常量__NAMESPACE__
,返回当前命名空间(string)__CLASS__
,返回一个以完全限定名称的类名称__METOD__
,返回一个以完全限定名称的方法名称__FUNCTION__
,范围一个以完全限定名称的函数名称
-3,用完全限定名称访问全局成员
以下代码是以完全限定名称访问4大类全局成员
<?php
//创建命名空间,必须在脚本的第一行
namespace chapterA;
//不同脚本的相同命名空间
//类
use chapterA\sub\NAME;
require 'demo2.php';
//$result = namespace\demo2::name();
//非限定名称的类访问,类名前没有'\'
$result = demo2::name();
//创建全局成员,用完全限度名称访问类、接口、函数、常量(全局成员)
//类
require 'demo3.php';
$result = \chapterB\sub\demo3::name();
// 限定名称访问全局成员
//接口
require 'demo4.php';
class sex implements sub\NAME {
public static function name() : array
{
return [
'namespace'=>__NAMESPACE__,
'class'=>__CLASS__,
'method'=>__METHOD__,
];
}
}
$result = sex::name();
//函数
require 'dem5.php';
//完全限定名称访问
$result = \chapterA\con\study();
//限定名称访问
$result = con\study();
//常量
require 'demo6.php';
//完全限定名称
$result = \chapterA\cons\NAME;
echo '<pre>' . print_r($result, true) . '</pre>';
-4,导入4大类全局成员的方式
(use
+\完全限定名称)
以下代码是导入
<?php
namespace chapterA;
// 导入和别名
//导入:声明当前脚本中要用到的,使用完全限定成员表示的全局成员
//导入的作用:全局成员导入后,就不在书写冗长的完全限定名称了
//语法:(use \完全限定名称的全局成员)因为默认全局开始,所以可以省略开头的\
//导入完全限定名称的类
require 'demo2.php';
use \chapterA\demo2;
$result = demo2::name();
//导入完全限定名称的接口
require 'demo4.php';
use \chapterA\sub\NAME;
class sex implements NAME {
public static function name() : array
{
return [
'namespace'=>__NAMESPACE__,
'class'=>__CLASS__,
'method'=>__METHOD__,
];
}
}
$result = sex::name();
//导入完全限定名称的函数
require 'dem5.php';
use function \chapterA\con\study;
$result = study();
//导入完全限定名称的常量
//require 'demo6.php';
//use const \chapterA\cons\NAME;
//$result = NAME;
//echo '<pre>' . print_r($result, true) . '</pre>';
//使用use将完全限定名称转换为限定名称
require 'demo6.php';
use const \chapterA\cons;
$result = cons\NAME;
echo '<pre>' . print_r($result, true) . '</pre>';
-5,别名的应用方式
别名是解决了在使用简化后的完全限定名称时,导致的命名冲突的问题
<?php
namespace chapterA;
//创建一个名为dome的类
class demo {
// ...
}
require 'demo9.php';
//导入一个不同脚本相同命名空间,且存在一个名为demo的类
//use \chapterA\demo;
//以上会提示错误:demo已存在
//解决方法:别名
use chapterA\sub\demo as demoA;
$result = demoA::class;
echo '<pre>' . print_r($result,true) . '</pre>';
问答题
-1,完全限定名称:以\
开头的,根目录
-2,限定名称:不以\
开头,且至少有一个反斜线
-3,非限定名称:当前命名命名空间下的名称
-4,完全限定名称,限定名称,非限定名称的转换,需要use
导入
//使用use将完全限定名称转换为限定名称
require 'demo6.php';
use const \chapterA\cons;
$result = cons\NAME;
//使用use将完全限定名称转换为非限定名称
require 'demo6.php';
use const \chapterA\cons\NAME;
$result = NAME;
echo '<pre>' . print_r($result, true) . '</pre>';
-5,use
解决了什么?
①当多次使用完全限定名称的时候,冗长的名称代码
②当使用简化后的完全限定名称,可能导致的命名冲突问题(别名)
-6,::class
为什么比__NAMESPACE__
好用?::class
可以快速的返回完全限定名称的类名称__NAMESPACE__
仅返回当前命名空间的名称