
批改狀態(tài):合格
老師批語(yǔ):命名空間很神奇
全局成員:寫在函數(shù)外部的東西
全局成員有四個(gè):函數(shù),常量,類,接口
全局成員最大特點(diǎn):不能重復(fù)命名
用namespace
關(guān)鍵字來(lái)定義命名空間
<?php
//命名空間A
namespace A;
//接口
interface iTest
{
public function getSite();
}
//類
class Demo implements iTest
{
public function getSite()
{
return 'php中文網(wǎng)';
}
}
//函數(shù)
function f1(iTest $obj){
return $obj->getSite();
}
//輸出
echo '函數(shù)輸出'.f1(new Demo).'<br>';
echo '類輸出'.(new Demo)->getSite().'<hr>';
/*———————————————————————————————————————————————————————————————————————————————— */
//命名空間B
namespace B;
//在B命名空間中訪問A命名空間中的類方法
echo '命名空間B調(diào)用getSite()方法'.(new \A\Demo)->getSite().'<br>';
//調(diào)用函數(shù)
echo \A\f1(new \A\Demo);
::
<?php
namespace one
{
class Demo
{
public function getSite()
{
return 'php中文網(wǎng)';
}
}
}
/*************************************************************************/
namespace two
{
echo (new \one\Demo)->getSite().'<br>';
//查看當(dāng)前類全名
echo '當(dāng)前類全名:'.two::class.'<br>';
echo '查看one的類全名:'.\one\Demo::class.'<br>';
class D{}
echo D::class;
}
/*************************************************************************/
//全局匿名空間
namespace
{
//因?yàn)橛辛巳帜涿臻g,那么全局成員的聲明就不應(yīng)該放在全局,而應(yīng)該放在空間中
//因此,全局空間應(yīng)該主要寫對(duì)全局對(duì)象的調(diào)用
echo '<br>'.(new one\Demo)->getSite();
}
/*************************************************************************/
<?php
//在空間中訪問類與訪問函數(shù)有什么區(qū)別
namespace one
{
//訪問類
echo \Test::NAME.'<hr>';
function var_dump($name)
{
echo 'HELLO 你好?****'.$name;
}
//如果調(diào)用的函數(shù)與系統(tǒng)內(nèi)置的函數(shù)重名,則優(yōu)先調(diào)用當(dāng)前空間的函數(shù)
//只有在當(dāng)前空間找不到這個(gè)函數(shù),再到全局中去找
var_dump(\Test::NAME);
echo '<br>';
\var_dump(\Test::NAME);
}
//全局
namespace
{
class Test
{
const NAME = 'PHP中文網(wǎng)';
}
}
<?php
//命名空間的別名
namespace one;
class Demo{}
/**********************************************************/
namespace two;
class Demo{}
/**********************************************************/
namespace three;
//訪問one::Demo
//從全局空間開始訪問,完全限定名稱的類
echo \one\Demo::class.'<br>';
//類名可以省略掉與當(dāng)前空間名稱重復(fù)的部分
//限定名稱的類:不從全局空間開始訪問
echo A\Hello::class,'<br>';
class Work{}
//3.訪問當(dāng)前空間中的類成員,不要添加空間名稱
//非限定名稱的類:Work
echo Work::class.'<br>';
echo \one\Demo::class.'<br>';
//使用空間或類的別名來(lái)簡(jiǎn)化這種調(diào)用
//空間級(jí)的別名:給空間起個(gè)別名,使用關(guān)鍵字use
//主要是針對(duì)完全限定名稱的類起的別名
use \one as I;
echo '別名訪問:'. I\Demo::class,'<br>';
//2.類級(jí)的別名,給完全限定名稱的類起個(gè)別名
use \two\Demo as R;
echo '別名訪問:' .R::class.'<br>';
//如果別名和類名相同,可以省略as后面的別名
//use \one\Demo as Demo;
//use \one\Demo;
//如果當(dāng)前類中也有一個(gè)與之同名的非限定的類,就不能省略別名
class Demo{}
use \one\Demo as em;
echo '別名訪問:' .em::class;
/**********************************************************/
namespace three\A;
class Hello{}
//完全限定名稱:從全局空間開始,前面總是由一個(gè)"\"
//限定名稱:類名總是會(huì)有一個(gè)或者多個(gè)空間名稱,但不是從全局開始
//非限定名稱:就是不帶有空間名稱的類
spl_autoload_register()
:注冊(cè)給定的函數(shù)作為 __autoload 的實(shí)現(xiàn)
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
參數(shù) | 描述 |
---|---|
autoload_function | 欲注冊(cè)的自動(dòng)裝載函數(shù)。如果沒有提供任何參數(shù),則自動(dòng)注冊(cè) autoload 的默認(rèn)實(shí)現(xiàn)函數(shù)spl_autoload()。 |
throw | 此參數(shù)設(shè)置了 autoload_function 無(wú)法成功注冊(cè)時(shí), spl_autoload_register()是否拋出異常。 |
prepend | 如果是 true,spl_autoload_register() 會(huì)添加函數(shù)到隊(duì)列之首,而不是隊(duì)列尾部。 |
<?php
//__DIR__
//echo __DIR__,'\\demo7.php';
echo __DIR__.'<hr>';
//require __DIR__ . '\\inc\\lib\\Test1.php';
//echo \inc\lib\Test1::class,'<br>';
//str_replace(目標(biāo)值,替換值,執(zhí)行替換的數(shù)組或者字符串,替換次數(shù))
$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
//類的自動(dòng)加載
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關(guān)鍵字來(lái)定義命名空間
命名空間分為完全限定名稱,限定名稱和非限定名稱
完全限定名稱:從全局空間開始,前面總是由一個(gè)”\”
限定名稱:類名總是會(huì)有一個(gè)或者多個(gè)空間名稱,但不是從全局開始
非限定名稱:就是不帶有空間名稱的類
別名的使用:use 命名空間名稱 as 自定義名稱
類的自動(dòng)加載:用spl_autoload_register()函數(shù)
對(duì)類的自動(dòng)加載有了初步認(rèn)識(shí),就是sql_autoload_register()這個(gè)函數(shù)有點(diǎn)難理解,不知道這個(gè)$class這個(gè)變量的值具體是怎么賦值的,我的理解是使用use時(shí)把命名空間名稱賦值給$class
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)