Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:命名空间很神奇
全局成员:写在函数外部的东西
全局成员有四个:函数,常量,类,接口
全局成员最大特点:不能重复命名
用namespace
关键字来定义命名空间
<?php
//命名空间A
namespace A;
//接口
interface iTest
{
public function getSite();
}
//类
class Demo implements iTest
{
public function getSite()
{
return 'php中文网';
}
}
//函数
function f1(iTest $obj){
return $obj->getSite();
}
//输出
echo '函数输出'.f1(new Demo).'<br>';
echo '类输出'.(new Demo)->getSite().'<hr>';
/*———————————————————————————————————————————————————————————————————————————————— */
//命名空间B
namespace B;
//在B命名空间中访问A命名空间中的类方法
echo '命名空间B调用getSite()方法'.(new \A\Demo)->getSite().'<br>';
//调用函数
echo \A\f1(new \A\Demo);
::
<?php
namespace one
{
class Demo
{
public function getSite()
{
return 'php中文网';
}
}
}
/*************************************************************************/
namespace two
{
echo (new \one\Demo)->getSite().'<br>';
//查看当前类全名
echo '当前类全名:'.two::class.'<br>';
echo '查看one的类全名:'.\one\Demo::class.'<br>';
class D{}
echo D::class;
}
/*************************************************************************/
//全局匿名空间
namespace
{
//因为有了全局匿名空间,那么全局成员的声明就不应该放在全局,而应该放在空间中
//因此,全局空间应该主要写对全局对象的调用
echo '<br>'.(new one\Demo)->getSite();
}
/*************************************************************************/
<?php
//在空间中访问类与访问函数有什么区别
namespace one
{
//访问类
echo \Test::NAME.'<hr>';
function var_dump($name)
{
echo 'HELLO 你好?****'.$name;
}
//如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数
//只有在当前空间找不到这个函数,再到全局中去找
var_dump(\Test::NAME);
echo '<br>';
\var_dump(\Test::NAME);
}
//全局
namespace
{
class Test
{
const NAME = 'PHP中文网';
}
}
<?php
//命名空间的别名
namespace one;
class Demo{}
/**********************************************************/
namespace two;
class Demo{}
/**********************************************************/
namespace three;
//访问one::Demo
//从全局空间开始访问,完全限定名称的类
echo \one\Demo::class.'<br>';
//类名可以省略掉与当前空间名称重复的部分
//限定名称的类:不从全局空间开始访问
echo A\Hello::class,'<br>';
class Work{}
//3.访问当前空间中的类成员,不要添加空间名称
//非限定名称的类:Work
echo Work::class.'<br>';
echo \one\Demo::class.'<br>';
//使用空间或类的别名来简化这种调用
//空间级的别名:给空间起个别名,使用关键字use
//主要是针对完全限定名称的类起的别名
use \one as I;
echo '别名访问:'. I\Demo::class,'<br>';
//2.类级的别名,给完全限定名称的类起个别名
use \two\Demo as R;
echo '别名访问:' .R::class.'<br>';
//如果别名和类名相同,可以省略as后面的别名
//use \one\Demo as Demo;
//use \one\Demo;
//如果当前类中也有一个与之同名的非限定的类,就不能省略别名
class Demo{}
use \one\Demo as em;
echo '别名访问:' .em::class;
/**********************************************************/
namespace three\A;
class Hello{}
//完全限定名称:从全局空间开始,前面总是由一个"\"
//限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始
//非限定名称:就是不带有空间名称的类
spl_autoload_register()
:注册给定的函数作为 __autoload 的实现
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
参数 | 描述 |
---|---|
autoload_function | 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。 |
throw | 此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。 |
prepend | 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。 |
<?php
//__DIR__
//echo __DIR__,'\\demo7.php';
echo __DIR__.'<hr>';
//require __DIR__ . '\\inc\\lib\\Test1.php';
//echo \inc\lib\Test1::class,'<br>';
//str_replace(目标值,替换值,执行替换的数组或者字符串,替换次数)
$path = str_replace('\\',DIRECTORY_SEPARATOR,'\inc\lib\Test1');
echo DIRECTORY_SEPARATOR.'<br>';
echo $path.'<hr>';
require __DIR__ .$path .'.php';
//echo __DIR__ . $path . '.php';
echo Test1::class;
<?php
//类的自动加载
try{
spl_autoload_register(function($class){
$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
$file = __DIR__ . $path.'.php';
if(!(is_file($file) && file_exists($file)))
throw new \Exception('不是文件或文件不存在');
require $file;
});
}catch(Exception $e){
die($e->getMessage());
}
use inc\lib\Test1;
use inc\lib\Test2;
use inc\lib\Test3;
echo Test1::class.'<br>';
echo Test2::class.'<br>';
echo Test3::class.'<br>';
用namespace关键字来定义命名空间
命名空间分为完全限定名称,限定名称和非限定名称
完全限定名称:从全局空间开始,前面总是由一个”\”
限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始
非限定名称:就是不带有空间名称的类
别名的使用:use 命名空间名称 as 自定义名称
类的自动加载:用spl_autoload_register()函数
对类的自动加载有了初步认识,就是sql_autoload_register()这个函数有点难理解,不知道这个$class这个变量的值具体是怎么赋值的,我的理解是使用use时把命名空间名称赋值给$class