亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

PHP命名空間和自動加載類
來源:易賢網 閱讀:1574 次 日期:2016-08-27 13:36:36
溫馨提示:易賢網小編為您整理了“PHP命名空間和自動加載類”,方便廣大網友查閱!

PHP的命名空間(namespace)是php5.3之后才有的。這篇文章主要介紹了PHP命名空間和自動加載類的相關資料,需要的朋友可以參考下

PHP的命名空間(namespace)是php5.3之后才有的。這個概念在C#中已經很早就有了,php中的namespace其實和c#的概念是一樣的。

為什么php中要使用namespace?

假設如果不使用namespace,那么每個類在一個項目中的名字就必須是固定的。因為php在new的時候不管是調用autoload還是調用已加載過的類,都存在一個類名對應的文件。所以在沒有namespace的時候,我們會想各種命名規則來區分不同的類,比如project1_school1_class1_Student或者project2_school_class_Student。

引入namespace之后就可以將這個有效規避了,一個namespace就相當于對應一個文件路徑,查找這個類的時候,就會去對應的文件路徑查找類定義文件了。

背景

最近有個朋友問我 PHP 命名空間是咋樣的,但是由于長期不做開發,筆者實際上也已經忘得差不多了,所以也回答不出來。只是記得和 Java 挺像的。事后重新查了一下 PHP 的官方文檔,并且和 Java 做對比,Java 的命名空間實際上來自于 JVM 本身的機制,JVM 是基于 class 字節碼文件加載類,由于類很容易出現重名的情況,換言之 class 字節碼文件也會出現重名情況,所以就需要使用目錄來管理不同的字節碼文件,而為了保證加載正常,所以就需要命名空間這種機制。當然,也可以說是由于命名空間的存在才有了目錄管理的方式。但是 PHP 和 Java 不一樣,PHP 是一種動態腳本語言,它的代碼分散在所有腳本中,當需要的時候才會使用 include 函數加載對應的文件,所以 PHP 的命名空間,實際上是基于 PHP 的自動加載類,自動加載類實現了才能保證 PHP 命名空間存在的意義。

命名空間概述

命名空間據筆者所知應該最早源于 C++ 語言,在 C++98 標準以后,為了保證各種命名不重合所推出的一種解決方案。現在的面向對象語言基本都有這種機制,當然除了命名空間以外,還有很多種方式,比如模塊化,不過實際上這些機制都是用來解決封裝問題的,所以筆者個人認為并無好壞之分。先把 PHP 官方文檔代碼拉出來溜溜

<?php

namespace my\name; // 參考 "定義命名空間" 小節

class MyClass {}

function myfunction() {}

const MYCONST = 1;

$a = new MyClass;

$c = new \my\name\MyClass; // 參考 "全局空間" 小節

$a = strlen('hi'); // 參考 "使用命名空間:后備全局函數/常量" 小節

$d = namespace\MYCONST; // 參考 "namespace操作符和__NAMESPACE__常量” 小節

$d = __NAMESPACE__ . '\MYCONST';

echo constant($d); // 參考 "命名空間和動態語言特征" 小節

?>

非常容易理解的代碼,從上面的代碼中可以看到 PHP 定義的命名空間是怎么樣的,不過筆者個人認為其定義非常反人類,居然使用反斜杠來分隔命名空間路徑。不過有一點需要注意,名為 PHP 或 php 的命名空間,以及以這些名字開頭的命名空間(例如PHP\Classes)被保留用作語言內核使用,而不應該在用戶空間的代碼中使用。

定義命名空間

PHP 命名空間功能只能在 PHP5.3.0 以上版本使用,對于一個命名空間,只有類、接口、函數和常量會被包含在命名空間中。

<?php

namespace MyProject;

const CONNECT_OK = 1;

class Connection { /* ... */ }

function connect() { /* ... */ }

?>

當然,也可以使用花括號來包含所有需要的內容,就像這樣。

<?php

declare(encoding='UTF-8');

namespace MyProject {

const CONNECT_OK = 1;

class Connection { /* ... */ }

function connect() { /* ... */ }

}

namespace { // 全局代碼

session_start();

$a = MyProject\connect();

echo MyProject\Connection::start();

}

?>

不過這樣很容易造成縮進上的問題,所以筆者不推薦使用,并且一般情況下,一個文件包含一個類,所以也不需要花括號來分割命名空間范圍。

使用命名空間

對于命名空間路徑來說,存在著三種形式

非限定名稱,或者說不包含前綴的類名稱。例如 $a=new foo(); 或 foo::staticmethod(); 。如果當前命名空間是 currentnamespace , foo 將被解析為 currentnamespace\foo 。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會被解析為 foo`。

限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod(); 。如果當前的命名空間是 currentnamespace ,則 foo 會被解析為 currentnamespace\subnamespace\foo 。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼, foo 會被解析為 subnamespace\foo 。

完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod(); 。在這種情況下, foo 總是被解析為代碼中的文字名 (literal name)currentnamespace\foo 。

由于 PHP 本身動態語言的特性,所以完全可以使用字符串動態訪問命名空間內的元素。

<?php

namespace namespacename;

class classname

{

function __construct()

{

echo __METHOD__,"\n";

}

}

function funcname()

{

echo __FUNCTION__,"\n";

}

const constname = "namespaced";

include 'example1.php';

$a = 'classname';

$obj = new $a; // prints classname::__construct

$b = 'funcname';

$b(); // prints funcname

echo constant('constname'), "\n"; // prints global

/* note that if using double quotes, "\\namespacename\\classname" must be used */

$a = '\namespacename\classname';

$obj = new $a; // prints namespacename\classname::__construct

$a = 'namespacename\classname';

$obj = new $a; // also prints namespacename\classname::__construct

$b = 'namespacename\funcname';

$b(); // prints namespacename\funcname

$b = '\namespacename\funcname';

$b(); // also prints namespacename\funcname

echo constant('\namespacename\constname'), "\n"; // prints namespaced

echo constant('namespacename\constname'), "\n"; // also prints namespaced

?>

不過有一點需要注意,就是單雙引號之間的區別,單引號可以不需要處理 \ 的轉譯處理,而雙引號就必須使用 \\ 等轉譯符號。

Java 語言使用 import 機制引入命名空間,由于 Java 可以指定到類名,所以 Java 最多只能導入到具體類,而 PHP 則可以指定到一個命名空間內的類、常量、方法等,并且支持命名空間別名。

<?php

namespace foo;

use My\Full\Classname as Another;

// 下面的例子與 use My\Full\NSname as NSname 相同

use My\Full\NSname;

// 導入一個全局類

use ArrayObject;

// importing a function (PHP 5.6+)

use function My\Full\functionName;

// aliasing a function (PHP 5.6+)

use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)

use const My\Full\CONSTANT

$obj = new namespace\Another; // 實例化 foo\Another 對象

$obj = new Another; // 實例化 My\Full\Classname 對象

NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func

$a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象

// 如果不使用 "use \ArrayObject" ,則實例化一個 foo\ArrayObject 對象

func(); // calls function My\Full\functionName

echo CONSTANT; // echoes the value of My\Full\CONSTANT

?>

名稱解析規則

首先就是前面講過的三種名稱類型,名稱解析遵循以下規則:

對完全限定名稱的函數,類和常量的調用在編譯時解析。例如 new \A\B 解析為類 A\B。

所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的導入規則在編譯時進行轉換。例如,如果命名空間 A\B\C 被導入為 C,那么對 C\D\e() 的調用就會被轉換為 A\B\C\D\e()。

在命名空間內部,所有的沒有根據導入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間 A\B 內部調用 C\D\e(),則 C\D\e() 會被轉換為 A\B\C\D\e() 。

非限定類名根據當前的導入規則在編譯時轉換(用全名代替短的導入名稱)。例如,如果命名空間 A\B\C 導入為C,則 new C() 被轉換為 new A\B\C() 。

在命名空間內部(例如A\B),對非限定名稱的函數調用是在運行時解析的。例如對函數 foo() 的調用是這樣解析的:

在當前命名空間中查找名為 A\B\foo() 的函數

嘗試查找并調用 全局(global) 空間中的函數 foo()。

在命名空間(例如A\B)內部對非限定名稱或限定名稱類(非完全限定名稱)的調用是在運行時解析的。下面是調用 new C() 及 new D\E() 的解析過程:

new C()的解析:

在當前命名空間中查找A\B\C類。

嘗試自動裝載類A\B\C。

new D\E()的解析:

在類名稱前面加上當前命名空間名稱變成:A\B\D\E,然后查找該類。

嘗試自動裝載類 A\B\D\E。

為了引用全局命名空間中的全局類,必須使用完全限定名稱 new \C()。

從上面的規則來看,實際上 PHP 的導入規則和 Java 有點類似,但是卻有不一樣,主要是因為 Java 是完全面向對象的,而 PHP 本質上還只是一種基于對象的語言。

自動加載類

在早期 PHP 開發中,開發者最煩的就是一堆 include 函數包含了一大堆文件,而且早期時候 PHP 面向對象的概念確實太差了,因為 PHP 作為一種腳本語言,不存在程序入口,所以腳本順序化執行的誘惑力實在是很大,即使面向對象開發,但是缺少極佳的模塊劃分導入機制,代碼可以說很難有美感,最大的代表就是 Wordpress。如果有朋友看過這個典型項目,可以覺得非常痛苦,因為各種初始化、業務流程都分散在各個不同的文件中,使用 include 函數進行銜接,然后每次頁面渲染都是同樣的要走一趟流程。當然,這是 Wordpress 的歷史包袱,而在支持老版本 PHP 的情況下 Wordpress 代碼已經寫得足夠優化了。

在 PHP5 中就不需要這么麻煩了,因為可以定義一個 __autoload() 函數,當調用一個未定義的類的時候就會啟動此函數,從而在拋出錯誤之前做最后的補救,不過這個函數的本意已經被完全曲解使用了,現在都用來做自動加載。

注意,這個函數實際上已經不被推薦使用了,相反,現在應當使用 spl_autoload_register() 來注冊類的自動加載函數。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

autoload_function 是需要注冊的自動裝載函數,如果此項為空,則會注冊 spl_autoload 函數,

throw 此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register() 是否拋出異常。

prepend 如果是 true, spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。

上面提到了 spl_autoload 函數,實際上注冊函數的規范就應當遵循此函數,函數聲明如下:

void spl_autoload ( string $class_name [, string $file_extensions ] )

由于這個函數默認實現是通過 C 語言,所以這里給出一個 PHP 語言的實現規范。

<?php

// Your custom class dir

define('CLASS_DIR', 'class/')

// Add your class dir to include path

set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);

// You can use this trick to make autoloader look for commonly used "My.class.php" type filenames

spl_autoload_extensions('.class.php');

// Use default autoload implementation

spl_autoload_register();

?>

大致上就和這個是類似的。實際上命名空間和自動加載類的結合就基本是通過路徑形式

function __autoload(){

$dir = './libralies';

set_include_path(get_include_path(). PATH_SEPARATOR. $dir);

$class = str_replace('\\', '/', $class) . '.php';

require_once($class);

}

將命名空間路徑替換為實際路徑。

以上內容是小編給大家介紹的PHP命名空間和自動加載類,希望對大家有所幫助!

更多信息請查看網絡編程
易賢網手機網站地址:PHP命名空間和自動加載類
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
一区二区福利| 麻豆亚洲精品| 亚洲精品视频啊美女在线直播| 在线观看成人一级片| 国产综合精品| 亚洲国产欧美不卡在线观看| 亚洲开发第一视频在线播放| 国产精品腿扒开做爽爽爽挤奶网站| 国产欧美短视频| 久久亚洲二区| 一区在线电影| 亚洲一区三区电影在线观看| 欧美不卡高清| 一区二区三区欧美在线| 久久精品天堂| 亚洲国产精品一区| 久久美女性网| 一本色道久久99精品综合| 看欧美日韩国产| 亚洲精一区二区三区| 美女国产一区| 夜夜爽av福利精品导航 | 亚洲视频中文| 国产精品永久入口久久久| 欧美精品麻豆| 亚洲欧美网站| 亚洲国产91| 欧美99在线视频观看| 国产亚洲亚洲| 亚洲日产国产精品| 欧美亚州在线观看| 欧美一区二区视频在线| 国产精品免费一区二区三区在线观看| 欧美三级视频| 欧美精品成人一区二区在线观看| 香蕉国产精品偷在线观看不卡| 激情亚洲网站| 国产中文一区二区| 国产精品大片| 欧美亚韩一区| 国产精品豆花视频| 欧美午夜电影在线观看 | 午夜久久黄色| 亚洲在线免费| 国产精品免费区二区三区观看| 亚洲三级免费| 国产欧美日韩亚洲一区二区三区| 亚洲激情一区| 9久re热视频在线精品| 亚洲青涩在线| 亚洲精选成人| 亚洲欧美卡通另类91av| 久久xxxx精品视频| 欧美在线三级| 国语精品一区| 9色精品在线| 国产农村妇女精品一区二区| 免费亚洲一区| 久久久xxx| 欧美日韩亚洲一区二区三区在线| 欧美精品一区二区三区久久久竹菊| 欧美国产三级| 亚洲高清毛片| 亚洲在线不卡| 国产精品v欧美精品∨日韩| 国内成+人亚洲| 99国产一区| 久久福利电影| 欧美日韩综合另类| 亚洲美女色禁图| 香蕉成人久久| 黄色免费成人| 亚洲一级在线| 欧美日韩网址| 中文亚洲欧美| 欧美另类专区| aa日韩免费精品视频一| 久久婷婷av| 影音先锋久久久| 欧美专区在线| 在线看片欧美| 午夜国产欧美理论在线播放| 亚洲日韩成人| 久久综合伊人77777麻豆| 亚洲高清免费| 久久欧美肥婆一二区| 黄色国产精品一区二区三区| 国产精品乱码一区二区三区| 国产精品mv在线观看| 国产精品一级久久久| 国产在线一区二区三区四区| 欧美一级专区| 亚洲久久一区二区| 欧美区日韩区| 久久精品一区二区国产| 99精品久久| 国内精品久久久久久久影视麻豆 | 欧美另类视频| 一区二区精品在线观看| 欧美日本三区| 久久亚洲电影| 免费在线一区二区| 国产美女在线精品免费观看| 在线看片欧美| 欧美啪啪一区| 欧美一区2区三区4区公司二百 | 乱码第一页成人| 亚洲裸体俱乐部裸体舞表演av| 欧美ab在线视频| 每日更新成人在线视频| 国产欧美日本在线| 国产三级精品在线不卡| 亚洲精选国产| 99国产精品自拍| 亚洲精品乱码| 亚洲清纯自拍| 一区二区黄色| 国产亚洲精品自拍| 午夜亚洲性色视频| 性欧美精品高清| 久久亚洲欧美| 午夜电影亚洲| 国内精品久久久久久久97牛牛| 国内在线观看一区二区三区| 极品中文字幕一区| 999亚洲国产精| 国产精品久久久久久模特| 亚洲影视综合| 久久精品二区三区| 欧美日本国产精品| 在线欧美视频| 国产亚洲欧美一区二区| 国产私拍一区| 久久中文精品| 狠狠久久婷婷| 国产精品主播| 欧美韩日精品| 亚洲人成人一区二区三区| 亚洲视频成人| 美日韩精品视频| 欧美日韩一区二区三区四区在线观看| 亚洲视频久久| 国产伦精品一区二区三区四区免费 | 午夜亚洲福利在线老司机| 久久久久综合一区二区三区| 久久夜色精品| 亚洲激情网站| 久热re这里精品视频在线6| 国产一区观看| 亚洲欧美国产不卡| 好吊视频一区二区三区四区| 91久久久一线二线三线品牌| 国产女主播一区二区三区| 欧美三区在线| 一本色道久久综合| 欧美成人综合一区| 一本一本久久a久久精品综合妖精| 国产一级久久| 狠狠爱综合网| 蜜桃av噜噜一区二区三区| 影音欧美亚洲| 午夜电影亚洲| 亚洲综合三区| 日韩午夜在线| 国产精品99一区二区| 国产精品免费在线| 一区视频在线| 欧美日本不卡| 久久久久欧美精品| 亚洲一区二区三区高清| 亚洲成人在线| 欧美午夜影院| 老司机午夜精品视频在线观看| 亚洲国产婷婷| 国模大胆一区二区三区| 久久尤物视频| 久久动漫亚洲| 性感少妇一区| 国产美女诱惑一区二区| 亚洲激情网站| 在线免费观看欧美| 亚洲第一在线| 尤物在线精品| 好吊日精品视频| 欧美日韩精品一区| 欧美精品七区| 欧美精品一区在线| 欧美成人69av| 欧美日韩一区二区三| 欧美激情1区2区| 欧美日韩国产探花| 欧美午夜不卡影院在线观看完整版免费| 久久精品女人| 欧美一区精品| 国产精品九九| 亚洲日韩成人| 国产精品推荐精品| 国产女主播一区二区三区| 亚洲精品1区2区| 一区二区高清视频| 欧美视频福利| 韩日精品在线| 91久久夜色精品国产九色| 亚洲图片欧洲图片日韩av| 亚洲无线视频| 99视频精品| 国产伦精品一区二区三区四区免费| 一区二区精品| 久久久久久色| 精久久久久久| 国产伦精品一区二区三区照片91| 午夜亚洲伦理| 欧美午夜电影在线观看| 亚洲激精日韩激精欧美精品| 国产欧美日韩在线播放| 麻豆精品91| 国产真实久久| 国产精品夜夜夜| 久久伊人一区二区| 亚洲网站视频| 久久av一区二区| 黑丝一区二区| 亚洲一区二三| 亚洲视频一区| 久久国产成人| 在线观看欧美一区| 美女精品在线| 亚洲精品日韩久久| 欧美国产高潮xxxx1819| 影音先锋久久资源网| 国产精品手机在线| 欧美午夜一区| 亚洲专区在线| 亚洲国产精品一区制服丝袜| 日韩午夜av| 久久蜜桃资源一区二区老牛| 国产精品入口66mio| 国产乱码精品一区二区三区不卡| 狠狠干成人综合网| 亚洲专区欧美专区| 激情久久久久久| 欧美在线亚洲| 国产精品日韩欧美一区| 激情欧美一区| 午夜国产精品视频| 狠色狠色综合久久| 老司机久久99久久精品播放免费| 激情av一区| 久久综合精品一区| 日韩一级大片| 黄色亚洲大片免费在线观看| 亚洲欧美日韩一区在线观看| 一区国产精品| 国内精品**久久毛片app| 久久经典综合| 亚洲永久字幕| 亚洲色诱最新| 一道本一区二区| 亚洲理论在线| 亚洲精品一品区二品区三品区| 欧美日韩mv| 牛夜精品久久久久久久99黑人| 香蕉成人久久| 久久riav二区三区| 亚洲尤物精选| 性欧美暴力猛交另类hd| 国产一区二区黄色| 日韩一级网站| 国产视频一区三区| 国产精品日韩| 久久久天天操| 国产精品va| 136国产福利精品导航网址| 国产一区久久| 亚洲国产日韩欧美一区二区三区| 影音先锋中文字幕一区二区| 国内精品久久久久久久97牛牛 | 激情欧美亚洲| 国语精品一区| 日韩午夜视频在线观看| 一区二区三区久久网| 亚洲一区二区网站| 国产精品三区www17con| 久久狠狠婷婷| 欧美精品偷拍| 亚洲人www| 校园春色综合网| 欧美在线视频一区二区三区| 欧美日韩国产一区精品一区| 黄色成人精品网站| 国产亚洲成人一区| 欧美高清一区二区| 亚洲国产精品一区| 亚洲一区免费| 欧美色一级片| 国产一级精品aaaaa看| 久久综合伊人77777麻豆| 亚洲一本视频| 亚洲免费中文| 国产综合久久| 亚洲欧美日韩另类精品一区二区三区 | 亚洲福利久久| 久久激情中文| 亚洲国产三级| 欧美二区视频| 国产精品久久久一区二区三区| 欧美69wwwcom| 亚洲一区二区三区在线观看视频| 欧美日韩日本国产亚洲在线| 一区二区三区国产盗摄 | 国产欧美一区二区视频| 午夜精品视频在线观看一区二区| 亚洲日韩成人| 欧美精品一级| 久久av一区二区| 亚洲精品国产日韩| 国产精品激情| 老司机午夜免费精品视频| 一区二区三区av| 国产精品国产一区二区| 久久久精品动漫| 国产亚洲亚洲| 亚洲精品自在在线观看| 欧美午夜欧美| 欧美不卡福利| 久久精品人人| 亚洲综合欧美| 国产精品欧美久久| 一本一本久久| 亚洲免费不卡| 亚洲大片在线| 伊人久久成人| 在线观看成人av| 亚洲午夜精品久久久久久浪潮| 欧美激情第六页| 欧美激情91| 欧美精品激情| 欧美日韩理论| 国语精品中文字幕| 国内精品福利| 伊人婷婷久久| 亚洲欧洲精品一区| 伊人成人在线视频| 亚洲国产精品久久久久久女王 | 欧美日韩在线大尺度| 欧美一区二区视频在线| 欧美一区免费| 久久久久久久波多野高潮日日| 性感少妇一区| 你懂的国产精品| 欧美日韩综合精品| 韩国久久久久| 最新亚洲一区| 国产精品久久久亚洲一区| 国产乱码精品| 欧美a级在线| 激情综合激情| 国产欧美一区二区三区另类精品| 中文亚洲免费| 久久久久久自在自线| 欧美国产免费| 91久久视频| 麻豆av一区二区三区| 欧美日韩一区二区三区在线观看免| 亚洲视频在线二区| 99在线热播精品免费99热| 免费一级欧美片在线播放| 欧美日韩p片| 日韩亚洲不卡在线| 久久精品国产清高在天天线 | 亚洲国产综合在线看不卡| 亚洲裸体俱乐部裸体舞表演av| 一本一本a久久| 久久激情一区| 一区视频在线| 亚洲欧美久久久| 国产在线视频欧美一区二区三区| 亚洲精品精选| 欧美一区二区三区久久精品茉莉花 | 性欧美videos另类喷潮| 午夜电影亚洲| 亚洲深夜福利| 狠狠干成人综合网| 久久久久国产精品一区二区| 在线精品亚洲一区二区| 久久久久久亚洲精品杨幂换脸| 精品91在线| 久久精品盗摄| 99国产精品| 国产精品v欧美精品v日韩| 小嫩嫩精品导航| 亚洲精品裸体| 国产综合自拍| 久久一区亚洲| 亚洲免费综合| 99热这里只有精品8| 国产综合网站| 午夜精品久久久久99热蜜桃导演 | 国产精品美女黄网| 亚洲视频一区|