搜尋
首頁後端開發php教程PHP 5.3中的命名空间:你用过了么?_PHP教程

【php100精选译文】命名空间是PHP 5.3中最重要的变化,对于C#和Java开发人员对这个词语非常熟悉了,他们终于可以更好地改变PHP应用程序的结构了。

为什么我们需要命名空间?

随着你的PHP代码库的增长,对之前定义的函数和类名进行修改时风险也更高了,当你试图增加第三方组件或插件时问题更严重,如果存在两个或两个以上的代码集实现了一个“Database”和“User”类会怎么样?

直到目前,唯一的解决办法是使用长的类/函数名,例如Wordpress在每个类和函数名前都使用了前缀“WP_”, Zend Framework使用了极具描述性的命名约定,导致类名非常冗长,如:

Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

命名冲突问题可以使用命名空间来解决,PHP常量、类和函数可以被组合到命名空间库中。

如何定义命名空间?

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

在PHP文件的顶部使用一个关键字namespace就可以定义命名空间,它必须是第一个命令(declare除外),在它前面不能出现非PHP代码、HTML或空格。如:

<ol class="dp-c">
<li class="alt"><span><span></span><li class="">
<span></span><span class="comment"><font color="#008200">// define this code in the 'MyProject' namespace </font></span><span> </span>
</li></span></li>
<li class="alt"><span>namespace MyProject;  </span></li>
<li class=""><span> </span></li>
<li class="alt">
<span></span><span class="comment"><font color="#008200">// ... code ... </font></span><span> </span>
</li>
</ol>

这一行下面的代码都是指定给MyProject命名空间的,为相同代码块嵌套命名空间或定义多个命名空间是不可能的,如果你真这样干,只有最后一个命名空间才能识别,但你可以在同一个文件中定义不同的命名空间代码,如:

<ol class="dp-c">
<li class="alt"><span><span></span><li class=""><span>namespace MyProject1;  </span></li>
<li class="alt">
<span></span><span class="comment"><font color="#008200">// PHP code for the MyProject1 namespace </font></span><span> </span>
</li></span></li>
<li class=""><span> </span></li>
<li class="alt"><span>namespace MyProject2;  </span></li>
<li class="">
<span></span><span class="comment"><font color="#008200">// PHP code for the MyProject2 namespace </font></span><span> </span>
</li>
<li class="alt"><span> </span></li>
<li class="">
<span></span><span class="comment"><font color="#008200">// Alternative syntax </font></span><span> </span>
</li>
<li class="alt"><span>namespace MyProject3 {  </span></li>
<li class="">
<span> </span><span class="comment"><font color="#008200">// PHP code for the MyProject3 namespace </font></span><span> </span>
</li>
<li class="alt"><span>}  </span></li>
<li class=""><span>?>  </span></li>
</ol>

尽管这么干是可以的,但我建议你不要这么做,最好还是每个文件中只定义一个命名空间,免得把你弄糊涂了。

子命名空间

PHP允许定义具有层次的命名空间以便库能够细分,子命名空间使用一个反斜线字符()分隔,如:

◆MyProjectSubName

◆MyProjectDatabaseMySQL

◆CompanyNameMyProjectLibraryCommonWidget1

调用命名空间代码

在lib1.php文件中我们使用AppLib1 namespace命名空间定义了一个常量、一个函数和一个类,如:

lib1.php

<ol class="dp-xml">
<li class="alt"><span><span class="tag"><strong><font color="#006699"></font></strong></span><span> ?php  </span></span></li>
<li class=""><span>// application library 1  </span></li>
<li class="alt"><span>namespace AppLib1;  </span></li>
<li class=""><span> </span></li>
<li class="alt">
<span>const </span><span class="attribute"><font color="#ff0000">MYCONST</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">'AppLib1MYCONST'</font></span><span>;  </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>function MyFunction() {  </span></li>
<li class=""><span> return __FUNCTION__;  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>class MyClass {  </span></li>
<li class=""><span> static function WhoAmI() {  </span></li>
<li class="alt"><span>  return __METHOD__;  </span></li>
<li class=""><span> }  </span></li>
<li class="alt"><span>}  </span></li>
<li class="">
<span></span><span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span>
</li>
</ol>

现在我们可以在另一个PHP文件包括这段代码,如:

myapp.php

<ol class="dp-xml">
<li class="alt"><span><span class="tag"><strong><font color="#006699"></font></strong></span><span> ?php  </span></span></li>
<li class=""><span>header('Content-type: text/plain');  </span></li>
<li class="alt"><span>require_once('lib1.php');  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>echo AppLib1MYCONST . "n";  </span></li>
<li class=""><span>echo AppLib1MyFunction() . "n";  </span></li>
<li class="alt"><span>echo AppLib1MyClass::WhoAmI() . "n";  </span></li>
<li class="">
<span></span><span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span>
</li>
</ol>

在myapp.php中并没有定义命名空间,因此这段代码存在全局空间中,任何对MYCONST、MyFunction和MyClass的直接引用都会失败,因为它们存在于AppLib1命名空间中,为了调用lib1.php中的代码,我们可以在AppLib1命名空间前添加前缀定义一个完全合格的名称,下面是我载入myapp.php时的输出结果:

<ol class="dp-xml">
<li class="alt"><span><span>AppLib1MYCONST    </span></span></li>
<li class=""><span>AppLib1MyFunction    </span></li>
<li class="alt"><span>AppLib1MyClass::WhoAmI </span></li>
</ol>

完全合格名称可以变得很长,定义长名称,如App-Lib1-MyClass,有一些明显的好处。

原文:How to Use PHP Namespaces, Part 1: The Basics

作者:Craig Buckler


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/446608.htmlTechArticle【php100精选译文】命名空间是PHP 5.3中最重要的变化,对于C#和Java开发人员对这个词语非常熟悉了,他们终于可以更好地改变PHP应用程序的结...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。