批改老师:天蓬老师
批改状态:合格
老师批语:__NAMESPACE__返回的只是普通字符串, ::class返回的可是一个真正的类, 可以直接 new
\
, 根目录
namespace part1;
{
//定义一个接口
interface iTest{
public function info();
}
}
namespace part2;
{
//用完全限定名称来访问part1中定义的接口
class cTest1 implements \part1\iTest{
public function info(){
return '实现接口的类';
}
}
$obj1 = new cTest1();
echo $obj1->info();
echo '<hr>';
}
namespace part1\lib;
{
//实现接口的类
class cTest implements \part1\iTest {
public function info(){
return [
'namespace'=>__NAMESPACE__,
'classname'=>__CLASS__,
'classname1'=>self ::class,
'methode'=>__METHOD__,
];
}
}
}
namespace part2;
{
//演示用完全限定名称访问part1中的类
$obj = new \part1\lib\cTest();
$arr = $obj->info();
echo '<pre>'.print_r($arr,true).'</pre>';
echo '<hr>';
}
访问函数
namespace part1\common;
{
//定义一个函数
function ftest(){
return '函数已运行';
}
}
namespace part2;
{
//演示用完全限定名称访问part1中的函数
$result = call_user_func('\part1\common\ftest');
echo '用完全限定名称访问函数:'.$result;
echo '<hr>';
}
访问常量
//注意此处命名空间的写法,这里没有用{}将内容包含住,一旦放入{}中const定义的常量会报错
namespace part1\param;
//定义一个常量
define('URL','www.php.cn');
const SITE_NAME = 'php中文网';
namespace part2;
{
//演示用完全限定名称访问part1中的常量
//因为URL是用define()定义的,因此不受命名空间影响,应该用全局空间
$url1 = URL;
$url2 = \URL;
$name = \part1\param\SITE_NAME;
echo '无完全限定名称的前缀\'\\\'访问define()定义的常量URL:'.$url1;
echo '<hr>';
echo '只有完全限定名称的前缀\'\\\'访问define()定义的常量URL:'.$url2;
echo '<hr>';
echo '需用整个完全限定名称访问const定义的常量URL:'.$name;
}
namespace part1;
{
//定义一个接口
interface iTest{
public function info();
}
}
namespace part2;
//用use导入part1中定义的接口
use \part1\iTest;
class cTest1 implements iTest{
public function info(){
return '实现接口的类';
}
}
$obj1 = new cTest1();
echo $obj1->info();
echo '<hr>';
namespace part1\lib;
{
//实现接口的类
class cTest implements \part1\iTest {
public function info(){
return [
'namespace'=>__NAMESPACE__,
'classname'=>__CLASS__,
'classname1'=>self ::class,
'methode'=>__METHOD__,
];
}
}
}
namespace part2;
//用use导入part1中的类
use \part1\lib\cTest;
$obj = new cTest();
$arr = $obj->info();
echo '<pre>'.print_r($arr,true).'</pre>';
echo '<hr>';
namespace part1\common;
{
//定义一个函数
function ftest(){
return __FUNCTION__;
}
}
namespace part2;
//用use function导入part1中的函数
use function \part1\common\ftest;
$result = ftest();
// echo $n =call_user_func('ftest');
echo '<hr>';
echo $m =call_user_func('\part1\common\ftest');
echo '<hr>';
echo '通过use function导入,来访问函数:'.$result;
echo '<hr>';
namespace part1\param;
//定义一个常量
define('URL','www.php.cn');
const SITE_NAME = 'php中文网';
namespace part2;
//用use const导入part1中的常量
//因为URL是用define()定义的,因此不受命名空间影响,应该用全局空间
use const URL,SITE_NAME;
$url1 = URL;
$url2 = \URL;
$name = \part1\param\SITE_NAME;
echo '通过use const导入,来访问define()定义的常量URL:'.$url1;
echo '<hr>';
echo '通过use const导入,来访问define()定义的常量URL:'.$url2;
echo '<hr>';
echo '通过use const导入,来访问const定义的常量URL:'.$name;
namespace part1;
{
//定义一个接口
interface iTest{
public function info();
}
}
namespace part2;
//用use导入part1中定义的接口
use \part1\iTest as iT;
class cTest1 implements iT{
public function info(){
return '实现接口的类';
}
}
$obj1 = new cTest1();
echo $obj1->info();
echo '<hr>';
namespace part1\lib;
{
//实现接口的类
class cTest implements \part1\iTest {
public function info(){
return [
'namespace'=>__NAMESPACE__,
'classname'=>__CLASS__,
'classname1'=>self ::class,
'methode'=>__METHOD__,
];
}
}
}
namespace part2;
//用use导入part1中的类
use \part1\lib\cTest as cT;
$obj = new cT();
$arr = $obj->info();
echo '<pre>'.print_r($arr,true).'</pre>';
echo '<hr>';
namespace part1\common;
{
//定义一个函数
function ftest(){
return __FUNCTION__;
}
}
namespace part2;
//用use function导入part1中的函数
use function \part1\common\ftest as ft;
$result = ft();
// echo $n =call_user_func('ftest');
echo '<hr>';
echo $m =call_user_func('\part1\common\ftest');
echo '<hr>';
echo '通过use function导入,来访问函数:'.$result;
echo '<hr>';
//注意此处命名空间的写法,这里没有用{}将内容包含住,一旦放入{}中const定义的常量会报错
namespace part1\param;
//定义一个常量
define('URL','www.php.cn');
const SITE_NAME = 'php中文网';
namespace part2;
//用use const导入part1中的常量
//因为URL是用define()定义的,因此不受命名空间影响,应该用全局空间
use const URL as UL;
// use const SITE_NAME as SN; //这样导入使用别名不成功
$url1 = UL;
// $name = SN;
echo '通过use const导入,来访问define()定义的常量URL:'.$url1;
echo '<hr>';
require
和include
具体文件。
namespace part1\lib;
{
//实现接口的类
class cTest implements \part1\iTest {
public function info(){
return [
'namespace'=>__NAMESPACE__,
'classname'=>__CLASS__,
'classname1'=>self ::class,
'methode'=>__METHOD__,
];
}
}
}
namespace part1;
$obj5 = new lib\cTest();//这里会被解析成为part1\lib\cTst
$arr = $obj5->info();
print_r($arr);
::class
操作符代表的是完全限定名称,__NAMESPACE__
常量代表的是非限定名称,::class
可以在别的命名空间中使用,而__NAMESPACE__
不行。类名::class
,这样就可以得到一个带完全限定名称的类名了,然后再怎么用不是很清楚。Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号