摘要:但實際上在命名空間這里卻不一樣,不同類文件中的命名空間之間是相互分離的,即某個文件中定義的的命名空間,在其他的類文件中不能使用。解決在中添加依賴類庫的命名空間別名以上就是今天遇到的關于命名空間的一個坑,謹記于此。
(沒想好title,見諒)
導讀PHP的類文件在被其他文件include的時候不能直接使用其他文件中的已定義的別名。
比如有三個文件。
test.php 一個簡單的腳本運行文件 NameSpaceClass.php 一個類文件,定義了一個命名空間 UseNameSpace.php,一個類文件,使用了NameSpaceClass命名空間里的類方法問題描述
如果在test.php文件中先定義了一個命名空間別名(use) ,且是NameSpaceClass的命名空間別名,然后直接include UseNameSpace.php,注意,先假設這里的UseNameSpace.php里不使用任何關于命名空間的東西。那么test.php代碼能正常運行么。
實踐我們先來看看這三個文件內容
test.php
use UtilNameSpaceClass; include("./NameSpaceClass.php"); include("./UseNameSpace.php"); UseNameSpace::out_put();
NameSpaceClass.php
namespace Util; class NameSpaceClass { public static function out_put() { echo "This is a Utils namespace "; } }
UseNameSpace.php:
class UseNameSpace { public static function use_out_put() { echo NameSpaceClass::out_put(); } }
從上面可以看出, NameSpaceClass.php里定義了一個命名空間Util, 并定義了類NameSpaceClass, 以及一個靜態方法out_put, 方法中只是輸出了一行字符串
UseNameSpace.php 中暫時未定義命名空間,但他的類方法直接調用了NameSpaceClass的方法,我們知道直接這么做是錯誤的,因為兩個根本不在一個命名空間內。
test.php 直接靜態調用UseNameSpace的方法,最終希望輸出NameSpaceClass.php中的內容
假設如果就目前這種代碼,直接運行test.php,會發生社么事情??
按照慣性思維,這種方式test從上到下,一次定義命名空間別名,加載類文件,輸出結果,雖然最終的UseNameSpace不在NameSpaceClass的命名空間內,但最開始已經定義命名空間別名(use UtilNameSpaceClass;)了, 應該會沒問題的了。
PHP Fatal error: Class "NameSpaceClass" not found in /tmp/UseNameSpace.php on line 7
結果卻出現了錯誤
分析慣性思維里,php的include操作類似于把要include的文件內容直接插入到該include的位置, 被include的文件應該直接能使用原有文件的已經定義的任何內容。
但實際上在命名空間這里卻不一樣, 不同類文件中的命名空間之間是相互分離的,即某個文件中定義的use的命名空間,在其他的類文件中不能使用。
以下來自一個大牛對我的指導(漲姿勢)
在包括其他的許多語言中,在定義類庫文件的時候,會在類庫中定義好本身的依賴關系,并做好不同情況下的兼容處理,而這也正式底層類庫的設計難點
我們PHP的命名空間正是這種依賴關系的一個體現,在定義好了一個類庫后,我們應該也要定義好他依賴的本類庫甚至是第三方的命名空間(用use),我們不能指望用戶在拿到這個類庫后還要自己去嘗試找到類的依賴命名空間,最起碼,我們應該給他一個提示,使用了哪些命名空間,怎么加載等等。
解決在UseNameSpace.php中添加依賴類庫的命名空間別名
use UtilNameSpaceClass;
以上就是今天遇到的關于php命名空間的一個坑,謹記于此。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20945.html
摘要:命名空間可以解決以下兩類問題用戶編寫的代碼與內部的類函數常量或第三方類函數常量之間的名字沖突。在命名空間內部訪問全局類函數和常量調用全局函數訪問全局常量實例化全局類命名空間和動態語言特征命名空間的實現受到其語言自身的動態特征的影響。 PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什么新事物。 不過在PHP當中還是有著相當重要...
摘要:命名空間到底解決了什么問題在入了關鍵字以及魔術常量,命名空間的作用是為了解決重名問題。發現了腳本情況下只引入命名空間是找不到類的這個事實??梢杂泻芏鄬懛ê筒煌挠梅ǎ蚣茉诖嘶A上可以添加命名空間的映射,實現根據命名空間加載對應目錄的工作。 1.命名空間到底解決了什么問題? PHP在5.3.0入了namespace關鍵字以及__NAMESPACE__魔術常量,命名空間的作用是為了解決重...
摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創建一個實例 ...
摘要:前言在開始之前,歡迎關注我自己的博客這篇文章是對自動加載功能的一個總結,內容涉及的自動加載功能的命名空間的與標準等內容。要實現第一步,第二步的功能,必須在開發時約定類名與磁盤文件的映射方法,只有這樣我們才能根據類名找到它對應的磁盤文件。 前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn 這篇文章是對PHP自動加載功能的一個總結,內容涉及PHP的自動加載功能、P...
閱讀 2814·2021-11-18 10:02
閱讀 3673·2021-11-15 17:59
閱讀 2306·2021-09-06 15:00
閱讀 3343·2019-08-29 16:58
閱讀 1056·2019-08-26 10:34
閱讀 1581·2019-08-26 10:15
閱讀 1286·2019-08-26 10:11
閱讀 2713·2019-08-23 18:33