導航:首頁 > 編程語言 > php命名空間沖突

php命名空間沖突

發布時間:2023-09-01 06:09:15

A. 介紹一下php的命名空間!php那個版本以上支持命名空間

1.介紹一下php的命名空間

什麼是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對於目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。
在PHP中,命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑。

2.php那個版本以上支持命名空間?

PHP 在 5.3.0 以後的版本開始支持命名空間。

B. 簡評用PHP開發大型系統的缺點

筆者在過去的四年裡一直致力於PHP應用的開發 PHP確實十分容易編寫 但是PHP也有一些十分嚴重的缺陷

下面筆者會給出自己的理由 為什麼PHP不適合於比小型業余網站更大的網站

對遞歸的不良支持

遞歸是一種函數調用自身的機制 這是一種強大的特性可以把某些復雜的東西變得很簡單 有一個使用遞歸的例子是快速排序(quicksort) 不幸的是 PHP並不擅長遞歸 Zeev 一個PHP開發人員 說道 PHP (Zend)對密集數據使用了棧方式 而不是使用堆方式 也就是說它能容忍的遞歸函數的數量限制和其他語言比起來明顯少 見bug 這是一個很不好的借口 每一個編程語言都應該提供良好的遞歸支持

許多PHP模塊都不是線程安全的

在幾年前 Apache發布了Web伺服器的 版 這個版本支持多線程模式 在這個模式下 軟體一個一部分可以同時運行多個 PHP的發明者說PHP的核心是線程安全的 但是非核心模塊不一定是 但是十次有九次 你想要在PHP腳本中使用這種模塊 但這又使你的腳本不能合適Apache的多線程模式 這也是為什麼PHP小組不推薦在Apache 的多線程模式下運行PHP 不良的多線程模式支持使PHP常被認為是Apache 依然不流行的原因之一

PHP 由於商業原因而不健全

通過使用緩存 PHP的性能可以陡增 %[見基準測試] 那麼為什麼緩存沒有被構建在PHP中呢?因為Zend——PHP的製造者 它在銷售自己的Zend Accelerator 所以當然 他們不想拋棄自己的商業產品這塊肥肉

但是有另一個可選擇的 APC (Zend後來推出Zend Optimizer 免費的加速器——譯者)

沒有命名空間

設想某個人製作了一個PHP模塊用來閱讀文件 模塊中一個函數叫做read 然後另一個人的模塊可以讀取網頁的 同樣包含一個函數read 然後我們就無法同時使用這兩個模塊了 因為PHP不知道你要用哪個函數

但是有一個很簡單的解決方法 那就是命名空間 曾經有人建議PHP 加入這個特性 但不幸得是他沒有這么做 現在 沒有命名空間 每個函數都必須加上模塊名作為前綴 來避免名稱沖突 這導致了函數名恐怖得長 例如xsl_xsltprocessor_transform_to_xml讓代碼難於書寫和理解

不標準的日期格式字元

很多敏敏程序員對 日期格式字元 都很熟悉 它是從UNIX和氏握C語言中來的 其他一些編程語言採用了這個標准 但是很奇怪的 PHP有它自己的一套完全不兼容的日期格式字元 在C中 %j 表示一年中的當天 在PHP中他表示一個月中的當天 然而使事情更混亂的是 Smarty (一個很流行的PHP模版引擎)的 strftime 函數和 date_format 函數 卻使用了C/UNIX的格式化字元

混亂的許可證

你也許認為PHP是免費的 所有的在手冊中提到的PHP模塊也是免費的 錯了!例如 如果你想在PHP中生成PDF文件 你會在手冊中發現兩個模塊 PDF 和 ClibPDF 但是這兩個都是有商業許可證的 所以 你所使用的每個模塊 你都要確保你同意他的許可證

不一致的函數命名規則

有些函數名稱是有多個單片語成的 一般有三種單詞殲拿慶組合的習慣

直接拼接 getnumberoffiles 用下劃線分開 get_number_of_files 駱駝法則 getNumberOfFiles 大部分語言選擇其中一中 但是PHP都用到了

例如 你想要把一些特殊字元轉換成HTML實體 你會使用函數entities (直接拼接單詞) 如果你要使用相反的功能 你要用到它的小弟弟_entity_decode 由於某些特殊的原因 這個函數名是由下劃線分隔單詞 怎麼能這樣呢?你知道有一個函數叫strpad 或者他是str_pad?每次你都要查看一下到底這個符號是什麼或者直接等他出現一個錯誤 函數是不分大小寫的 所以對於PHP來說rawurldecode 和RawUrlDecode之間沒有什麼區別 這也很糟糕 因為兩個都使用到了同時他們看上去還不一樣 混淆了閱讀者

魔法引用的地獄

魔法引用(Magic quote)可以保護PHP腳本免受SQL注入攻擊 這很好 但是出於某些原因 你可以在php ini中關閉這個配置 所以你如果要寫出一個有彈性的腳本 你總要檢查魔法引用是開啟還是關閉 這樣一個 特性 應該讓編程更簡單 而事實上變得更復雜了

缺少標准框架

一個成長中的網站沒有一個整體框架 最終會變成維護的噩夢 一個框架可以讓很多工作變得簡單 現在最流行的框架模型時MVC 模型 在其中表現層 業務邏輯和資料庫訪問都分離開了

很多PHP網站不使用MVC 模型 他們甚至沒有一個框架 甚至現在有一些PHP框架同時你都可以自己寫一個 關於PHP的文章和手冊沒有提高框架的一個字 同時JSP 開發人員使用像Struts的框架 ASP開發人員使用 Net 看起來好像這些概念都廣泛被PHP開發人員所了解 這就說明了PHP實際上到底是多專業

總結

什麼問題?

對於非常小的項目 它可以是一個十分符合人意的編程語言 但是對於較大的和更為復雜的項目 PHP就顯出他的薄弱了 當你不斷地摸索之後 你會發現筆者提到的某些問題的解決方案 所以 當解決方案已知之後 為什麼不能修正他呢?另外為什麼這些修補不在手冊中提到呢?

一個開源的語言十分流行是一件好事 但不幸得是 它不是一個偉大的語言 筆者希望所有的問題能有一天得到解決(也許在PHP ?) 然後我們就將擁有一個開源語言 他既開源 又好用

lishixin/Article/program/PHP/201311/21478

C. php命名空間沒有autoload能用么

能用。

__autoload 是當前需要使用的類沒有引入時,在PHP拋出錯誤前被觸發,未定義的類名會被當作參數傳入。
命名空間主要是為了解決命名沖突問題。單獨使用命名空間只是讓類名增加前綴,不發生沖突,系統並不會進行自動導入類。
只要你已經通過include等導入了類,就可以不使用autoload。

D. php7使用use引入命名空間提示語法錯誤

我也遇到了這個問題,我是這樣解決的,我伺服器裝了5.2和7.2兩個版本,可能兩者有沖突,5.2不支持命名空間,不支持use和namespace,解決辦法就是卸載5.2版本!!!

E. PHP 5.3 特性:命名空間

PHP 的一個新的重要特性就是 命名空間(namespace) 這一特性在 PHP x 時候就提出過 後來被取消並安排在 PHP 中實現 而此次又再次 提前 到了 PHP 發布 可見開發人員對其的重視以及謹慎的態度

官方發跡擾粗布時說明文檔的內容可能已過期(documentation maybe out dated) 所以在這里簡單的說明命名空間的用法 首先是聲明一個命名空間 加入了新的關鍵字 namespace 其應在類文件的開頭

<?php namespace Project::Mole; class User { const STATUS_OK = true; function register($data) { } } ?>

然後在控制器中(可能是其他文件)就可以這樣調用

$user = new Project::Mole::User(); $user >register($register_info);

的確與平常的並無兩樣 但是我們可以將兩個相互獨立的類聯系李逗起來 比如

Project::Mole::User; Project::Mole::Blog;

這樣就能從語言本身更容易描述和理解變數 類之間的關系 從而避免了 傳統 上的 Project_Mole_Blog 這樣冗長的命名方式 上面的說明可能很難說明使用命名空間帶來了什麼好處 新增加的 use 和 as 關鍵字或許能更好的說明問題 use 和 as 語句可以引用和聲明 命名空間的 別名 比如 上述的控制器中實例化類的代碼可以這樣寫

use Project::Mole; $user = new Mole::User(); $user >register($register_info);

甚至

use Project::Mole::User as MoleUser; $user = new MoleUser; $user >register($register_info);

類中的常量也可以通過命名空間訪問 比如上述類中的 STATUS_OK 就可以通過命名空間

Project::Mole::User::STATUS_OK

訪問 進一步的 也可以用別名簡化那麼長的 變數名稱

use Project::Mole::User::STATUS_OK as STATUS_OK; echo STATUS_OK;

順便提下 超空間(The Global Namespace) 的概念 所謂的 超空間 就是沒有指定命名空間的變數 類和函數 比如

function foo() { }

這的姿鎮函數 可以使用 foo() 執行的同時 也可以使用 ::foo(); 這樣執行

最後 配合使用 autoload 函數即可載入指定命名空間的類 簡單的函數如下

function __autoload( $classname ) { $classname = strtolower( $classname ); $classname = str_replace( :: DIRECTORY_SEPARATOR $classname ); require_once( dirname( __FILE__ ) / $classname class php ); }

這樣 比如調用

__autoload( Project::Mole::User );

lishixin/Article/program/PHP/201311/21303

F. PHP中不同文件夾使用相同的命名空間,相互之間應該如何調用呢能不能舉例說明一下。

那麼在不同文件中晌襲命名相同的命名空間就表示在一個容器下...不過在不同目錄下相同的命名空間我還不是太清楚.一般都是在一個項目文件下的...我去找找有答案在添激卜加宴鉛兄

命名空間可以解決下面兩個問題:

(1)用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。

(2)為很長的標識符創建一個別名,提高代碼的可讀性,減少代碼的編寫量。

G. php不同命名空間下不能使用include

php不同命名空間下不能使用include的原因是:php命名空間在第一個文件開關以namespace命名空間名,則當前的文件為該命名空間,當include其他文件的,其他文件的命名空間為文件的開頭namespace名,如沒有為全局,不因為include繼承,查看當前文件的命名空間可用echo,NAMESPACE;php,include,文件位置,第一個include文件為最初文件位置,與當前文件無關,與載入的第一個文件有關。

閱讀全文

與php命名空間沖突相關的資料

熱點內容
第二屆程序員節開幕式 瀏覽:82
運維程序員腳本 瀏覽:369
塑源碼燕窩的安全性 瀏覽:174
作業調度採用高響應比優先調度演算法 瀏覽:160
和平精英如何切換蘋果到安卓 瀏覽:530
資料庫調用表單的命令 瀏覽:920
程序員技能大賽 瀏覽:9
什麼app買品牌衣服 瀏覽:13
手機看世界名著哪個app好 瀏覽:493
運行命令切換列印機用戶 瀏覽:919
android滑動button 瀏覽:939
伺服器日誌可以干什麼 瀏覽:644
安卓系統空間怎麼清理軟體 瀏覽:343
維也納pdf 瀏覽:641
加密貨幣交易所哪個最好 瀏覽:816
linux的現狀 瀏覽:926
命令與征服叛逆者修改器 瀏覽:246
怎麼用ios玩安卓全民槍戰 瀏覽:668
程序員入行前後的頭發 瀏覽:711
嵌入式圖像演算法 瀏覽:329