奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語(yǔ)言

PHP中的命名空間介紹

時(shí)間:2024-09-01 09:35:05 php語(yǔ)言 我要投稿
  • 相關(guān)推薦

PHP中的命名空間介紹

  導(dǎo)語(yǔ):PHP命名空間(namespace)的概念、正在使用命名空間、定義命名空間、子命名空間、從命名空間中調(diào)用代碼等內(nèi)容你都知道嗎?以下的是百分網(wǎng)小編為大家搜集的PHP中的命名空間詳細(xì)介紹,希望對(duì)你有所幫助。

  概述

  PHP對(duì)于命名空間的支持,經(jīng)歷了一段艱難的旅程。幸運(yùn)的是,PHP從5.3開(kāi)始引入了命名空間。自從PHP引入了命名空間,PHP代碼的適用結(jié)構(gòu)也得到了大大的改善。許多編程語(yǔ)言早就有了命名空間的概念,相對(duì)于其他語(yǔ)言來(lái)說(shuō),PHP對(duì)于命名空間的支持,稍微有點(diǎn)晚了。不管如何,每一種新特性的引入都有其目的,和其他語(yǔ)言一樣,PHP引入命名空間也主要是為了解決名字沖突的問(wèn)題。

  命名空間(namespace)的概念

  代碼如下:

  當(dāng)在字符串中使用命名空間名字的時(shí)候,一定不要忘了轉(zhuǎn)義

  可以將命名空間想象成一個(gè)抽屜,你可以在抽屜里放入鉛筆、尺子、A4紙等,這些都是你自己的私有物品。在你的抽屜下面是別人的抽屜,別人也可以在抽屜里放入相同的物品。為了不拿錯(cuò)物品,你們決定在自己的抽屜上貼上標(biāo)簽,這樣就可以清晰的看到某個(gè)物品是屬于誰(shuí)的了。

  之前,開(kāi)發(fā)者必須在類(lèi)、函數(shù)和常量中添加下劃線(xiàn),用來(lái)使自己的代碼獨(dú)立其他于代碼庫(kù)。這相當(dāng)于所有人都給自己的物品貼上標(biāo)簽之后,一起放入了一個(gè)更大的抽屜里。盡管這也是一種組織代碼的方式,但是這種方式是非常低效的。

  命名空間的到來(lái)就是為了解決這個(gè)問(wèn)題。我們可以在不同的命名空間里聲明相同的函數(shù)、類(lèi)和常量,而不會(huì)造成名字上的沖突。本質(zhì)上,命名空間無(wú)非是一種分等級(jí)標(biāo)記PHP代碼的方式。

  正在使用命名空間

  有一點(diǎn)需要注意的是,我們正在間接的使用命名空間。從PHP 5.3開(kāi)始,所有在非用戶(hù)定義的命名空間中的聲明(類(lèi)、函數(shù)、常量),都默認(rèn)的屬于全局命名空間。

  全局命名空間中包含了所有PHP內(nèi)部的定義,如echo()、mysqli_connect()和Exception類(lèi)。由于全局命名空間并沒(méi)有獨(dú)立的標(biāo)識(shí)名,所以它經(jīng)常被成為全局空間(global space)。

  定義命名空間

  命名空間的定義必須是PHP文件的第一條語(yǔ)句。唯一允許在定義命名空間之前使用的語(yǔ)句是declare語(yǔ)句。

  定義命名空間很簡(jiǎn)單,只需要使用關(guān)鍵字namespace即可。命名空間的名字需要遵循PHP文件中其他標(biāo)識(shí)符的命名規(guī)則。

  下面是定義一個(gè)命名空間的示例:

  代碼如下:

  namespace MyNamespace{

  class Test{

  }

  }

  如果想定義一個(gè)屬于全局空間的代碼塊,也是使用namespace關(guān)鍵字,但是后面不加命名空間的名字,如下:

  代碼如下:

  namespace {

  class Test{

  }

  }

  我們甚至可以在一個(gè)文件中定義多個(gè)命名空間,如下:

  代碼如下:

  namespace MyNamespace {

  }

  namespace MySecondNamespace {

  }

  namespace {

  }

  我們也可以將一個(gè)命名空間分散在不同的文件中,文件包含的處理程序會(huì)自動(dòng)合并他們。因此,限制大量的命名空間在同一個(gè)文件中定義是一個(gè)很好的編程實(shí)踐,就像我們通常單獨(dú)為每個(gè)類(lèi)定義一個(gè)單獨(dú)的文件一樣。

  復(fù)制代碼 代碼如下:

  有一點(diǎn)需要注意的是,包含命名空間代碼塊的{是可選的,可以用也可以不用。事實(shí)上,只要我們堅(jiān)持在一個(gè)文件中只定義一個(gè)命名空間,那么我們就可以完全省略{,這樣也可以使我們的代碼看起來(lái)更加簡(jiǎn)潔。

  子命名空間

  命名空間可以遵循一個(gè)特定的層級(jí),就像我們電腦文件系統(tǒng)中得目錄一樣。子命名空間對(duì)于將一個(gè)項(xiàng)目結(jié)構(gòu)化尤其特別有用。例如,你的項(xiàng)目需要訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),你可能會(huì)想將所有數(shù)據(jù)庫(kù)相關(guān)的代碼(如數(shù)據(jù)庫(kù)異常處理等)放在同一個(gè)子目錄下。

  為了保持靈活性,將子命名空間放在子目錄中是非常明智的做法。這會(huì)使你的代碼結(jié)構(gòu)更清晰,而且會(huì)使遵循PSR-0標(biāo)準(zhǔn)的autoloaders的使用變得更容易。

  PHP使用反斜線(xiàn)作為命名空間的分隔符,有趣的是,PHP甚至考慮過(guò)使用笑臉:)作為命名空間的分隔符。

  子命名空間定義示例:

  代碼如下:

  namespace MyProjectDatabase

  class Connection {

  }

  可以使用盡可能多的子命名空間:

  代碼如下:

  namespace MyProjectBlogAuthHandlerSocial;

  class Twitter {

  }

  有一點(diǎn)需要注意的是,PHP并不支持命名空間的嵌套定義,下面的代碼會(huì)導(dǎo)致一個(gè)致命錯(cuò)誤:Namespace declarations cannot be nested。

  代碼如下:

  namespace MyProject {

  namespace Database {

  class Connection { }

  }

  }

  從命名空間中調(diào)用代碼

  如果你想在不同的命名空間中實(shí)例化一個(gè)類(lèi)、調(diào)用一個(gè)函數(shù)或者使用常量,需要使用反斜線(xiàn)。他們可以從三個(gè)角度被解析:

  1.未限定的名字

  2.限定的名字

  3.完全限定的名字

  未限定的名字(Unqualified Name)

  這是一個(gè)類(lèi)的名稱(chēng),函數(shù)或常量,但是不包括任何命名的引用。如果命名空間對(duì)你來(lái)說(shuō)還比較陌生,那么這就是你熟悉的角度。

  代碼如下:

  namespace MyProject;

  class MyClass {

  static function static_method()

  {

  echo 'Hello, world!';

  }

  }

  // Unqualified name, resolves to the namespace you are currently in (MyProjectMyClass)

  MyClass:static_method();

  限定的名字(Qualified Name)

  這是我們?nèi)绾问褂米用臻g的方式。示例如下:

  代碼如下:

  namespace MyProject;

  require 'myproject/database/connection.php';

  // Qualified name, instantiating a class from a sub-namespace of MyProject

  $connection = new DatabaseConnection();

  完全限定的名字(Fully Qualified Name)

  前面所說(shuō)的使用限定的名字和未限定的名字,都是相對(duì)于當(dāng)前所處的命名空間來(lái)說(shuō)的。以上兩種方式僅可以被用來(lái)訪(fǎng)問(wèn)當(dāng)前所處的命名空間和更深層次的子命名空間。

  如果想訪(fǎng)問(wèn)一個(gè)在比前命名空間更高的層級(jí),那么就需要使用完全限定的名字—一個(gè)絕對(duì)路徑而不是相對(duì)路徑。這可以歸結(jié)為在命名空間的最前面加反斜杠。使用完全限定的名字可以讓PHP知道,這次調(diào)用是從全局空間開(kāi)始的,而不是相對(duì)于當(dāng)前所處的命名空間。示例如下:

  代碼如下:

  namespace MyProjectDatabase;

  require 'myproject/fileaccess/input.php';

  // Trying to access the MyProjectFileAccessInput class

  // This time it will work because we use the fully qualified name, note the leading backslash

  $input = new MyProjectFileAccessInput();

  對(duì)于PHP的內(nèi)部函數(shù)來(lái)說(shuō),我們不必要使用完全限定的名字。在當(dāng)前所處的命名空間中,調(diào)用一個(gè)不存在的未限定的名字的類(lèi)或函數(shù),PHP會(huì)搜索全局空間。

  記住了這個(gè)規(guī)則,我們就可以像下面那樣重寫(xiě)PHP的內(nèi)部函數(shù):

  代碼如下:

  namespace MyProject;

  var_dump($query); // Overloaded

  var_dump($query); // Internal

  // We want to access the global Exception class

  // The following will not work because there's no class called Exception in the MyProjectDatabase namespace and unqualified class names do not have a fallback to global space

  // throw new Exception('Query failed!');

  // Instead, we use a single backslash to indicate we want to resolve from global space

  throw new Exception('ailed!');

  function var_dump() {

  echo 'Overloaded global var_dump()!

  ';

  }

  動(dòng)態(tài)調(diào)用

  PHP是一門(mén)動(dòng)態(tài)語(yǔ)言,也可以將PHP的這種特性用來(lái)調(diào)用命名空間。這在本質(zhì)上與實(shí)例化一個(gè)變量類(lèi)和包含一個(gè)變量文件是相同的。在字符串中,PHP使用的命名空間分隔符()也是一個(gè)元字符,因此需要轉(zhuǎn)義。

  代碼如下:

  namespace OtherProject;

  $project_name = 'MyProject';

  $package_name = 'Database';

  $class_name = 'Connection';

  // Include a variable file

  require strtolower($project_name . '/'. $package_name . '/' . $class_name) . '.php';

  // Name of a variable class in a variable namespace. Note how the backslash is escaped to use it properly

  $fully_qualified_name = $project_name . '' . $package_name . '' . $class_name;

  $connection = new $fully_qualified_name();

  namespace關(guān)鍵字

  關(guān)鍵字namespace不僅僅可以用來(lái)定義一個(gè)命名空間,它也可以用來(lái)顯示的表示當(dāng)前命名空間,它此時(shí)的作用相當(dāng)于類(lèi)中的self關(guān)鍵字。

  代碼如下:

  namespace MyProject;

  function run()

  {

  echo 'Running from a namespace!';

  }

  // Resolves to MyProjectrun

  run();

  // Explicitly resolves to MyProjectrun

  namespacerun();

  __NAMESPACE__常量

  就像self關(guān)鍵字不能表示當(dāng)前類(lèi)的名字一樣,namespace關(guān)鍵字也不能用來(lái)表示當(dāng)前命名空間的名字。__NAMESPACE__關(guān)鍵字就是用來(lái)解決這個(gè)問(wèn)題的。

  代碼如下:

  namespace MyProjectDatabase;

  // 'MyProjectDatabase'

  echo __NAMESPACE__;

  這個(gè)關(guān)鍵字對(duì)于判斷當(dāng)前代碼是否從命名空間開(kāi)始時(shí)非常有用,而且也可以用來(lái)調(diào)試代碼。

  導(dǎo)入或別名

  PHP中得命名空間也支持導(dǎo)入,導(dǎo)入也被成為別名。只有類(lèi)、接口和命名空間可以被導(dǎo)入(別名)。導(dǎo)入是命名空間中一個(gè)非常有用和基礎(chǔ)的功能。它使我們可以使用外部的代碼包,而不用擔(dān)心名字的沖突。使用use關(guān)鍵字可以實(shí)現(xiàn)導(dǎo)入功能。也可以使用as關(guān)鍵字,在導(dǎo)入的時(shí)候指定一個(gè)別名。

  代碼如下:

  use [name of class, interface or namespace] as [optional_custom_alias]

  一個(gè)完全限定的名字可以用一個(gè)未限定的別名來(lái)代替,這樣我們就不用在每次使用的時(shí)候都使用完全限定的名字,達(dá)到簡(jiǎn)化代碼的目的。導(dǎo)入應(yīng)該在命名空間的最高層或者全局空間中使用,在函數(shù)作用域內(nèi)使用導(dǎo)入功能是非法的語(yǔ)法。

  代碼如下:

  namespace OtherProject;

  // This holds the MyProjectDatabase namespace with a Connection class in it

  require 'myproject/database/connection.php';

  // If we want to access the database connection of MyProject, we need to use its fully qualified name as we're in a different name space

  $connection = new MyProjectDatabaseConnection();

  // Import the Connection class (it works exactly the same with interfaces)

  use MyProjectDatabaseConnection;

  // Now this works too! Before the Connection class was aliased PHP would not have found an OtherProjectConnection class

  $connection = new Connection();

  // Import the MyProjectDatabase namespace

  use MyProjectDatabase;

  $connection = new DatabaseConnection()

  我們可以通過(guò)使用別名來(lái)簡(jiǎn)化上面的代碼:

  代碼如下:

  namespace OtherProject;

  require 'myproject/database/connection.php';

  use MyProjectDatabaseConnection as MyConnection;

  $connection = new MyConnection();

  use MyProjectDatabase as MyDatabase;

  $connection = new MyDatabaseConnection();

  總結(jié)

  命名空間是用來(lái)避免定義沖突,并且為代碼引入了更加靈活和組織的方式。有一點(diǎn)需要注意的時(shí),我們并沒(méi)有義務(wù)去使用命名空間,它是和面向?qū)ο蠼Y(jié)合使用的一種工作方式。但是,如果使用了命名空間,我們的代碼可能會(huì)達(dá)到一種新的層次,逼格也會(huì)顯得更高吧。

【PHP中的命名空間介紹】相關(guān)文章:

PHP語(yǔ)言的命名規(guī)則是什么08-14

PHP常量介紹05-27

PHP變量介紹02-28

PHP簡(jiǎn)單介紹09-29

關(guān)于php中sql注入與XSS攻擊的相關(guān)介紹07-04

PHP中多態(tài)如何實(shí)現(xiàn)09-04

PHP中實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)07-06

PHP中this關(guān)鍵字06-08

PHP中的trait是什么08-13

php中fsockopen用法實(shí)例06-20

主站蜘蛛池模板: 青岛市| 襄樊市| 荆门市| 莱西市| 南开区| 教育| 甘孜县| 杭锦后旗| 南阳市| 汽车| 特克斯县| 临泽县| 三都| 长岭县| 葫芦岛市| 乌兰浩特市| 淮阳县| 乐至县| 延川县| 共和县| 德昌县| 惠东县| 南阳市| 承德市| 沙坪坝区| 马关县| 樟树市| 寿阳县| 大丰市| 个旧市| 抚顺市| 桂东县| 棋牌| 宿松县| 察隅县| 临海市| 湄潭县| 北安市| 揭东县| 金平| 锦州市|