PHP的namespace

文章目錄

  • 環境
  • Java的package
    • package關鍵字
    • 包結構和目錄結構
    • 訪問權限
    • import關鍵字
    • 總結
  • PHP的namespace
    • namespace關鍵字
    • 在同一個文件里使用資源
      • 限定,完全限定,非限定
        • 限定
        • 完全限定
        • 非限定
    • use關鍵字
    • use VS 直接指定資源
    • 在不同的文件里使用
    • 總結

環境

  • Windows 11 專業版
  • PHP 8.2.12

Java的package

在學習PHP的namespace之前,先來復習一下Java的package。

package關鍵字

Java使用 package 關鍵字來聲明包,支持多級結構,各級之間以 . 分隔。

一般全部使用小寫字母,使用倒序,比如: com.mycompany.myproject.mypackage

例如:

  • MyClass1.java
package mypkg1.mysubpkg1; // 聲明packagepublic class MyClass1() {
......
}
  • MyClass2.java
package mypkg2.mysubpkg1; // 聲明packageimport mypkg1.mysubpkg1.MyClass1; // 引入MyClass1public class MyClass2() {public static void main(String[] args) {var obj = new MyClass1();......}
......
}

包結構和目錄結構

在Java里,包結構和實際文件的目錄結構必須保持一致,如果不一致則編譯報錯。

比如包名是 com.mycompany.myproject.mypackage ,則實際目錄結構必須是 com/mycompany/myproject/mypackage 。其中 com 目錄是在Java源代碼的根目錄下。

此外,如果Java文件包含了public類(一個Java文件里最多只能有一個public類),則文件名必須與該類的命名一致,參見上面的例子。

訪問權限

Java的包會影響訪問權限。

我們知道,Java的訪問修飾符如下:

  • public :在任何地方都可見
  • protected :只在同一個包,以及子類中可見
  • 缺省(包訪問權限):只在同一個包中可見
  • private :只在本類內部可見

注意:一個Java文件里可以定義多個類,它們也是在同一個包里的(但一個Java文件里最多只能有一個public類)。

訪問修飾符同一個類同一個包不同包的子類不同包的非子類
publicYYYY
protectedYYYN
缺省YYNN
privateYNNN

import關鍵字

Java通過 import 關鍵字來引入包資源。由于包結構和實際文件目錄結構一致,所以 import 既指定了包結構,也指定了目錄結構(這和PHP是不同的)。

在import語句中,可以指定一個資源,也可以使用通配符 * ,比如:

  • import java.util.List
  • impport java.util.*

使用 import 來引入資源后,接下來就可以直接使用資源,而不需要指定資源的全限定名了,比如:

import java.util.ArrayList;
......ArrayList<String> list = new ArrayList<>();

注意:如果不通過 import 來引入資源,也可以使用資源,只不過每個用到資源的地方,都需要指定全限定名,比如:

        java.util.ArrayList<String> list = new java.util.ArrayList<>();

總結

  • 使用 package 關鍵字來聲明包,各級之間以 . 分隔
  • 包結構和實際文件目錄結構必須一致
  • 包可以影響訪問權限
  • 通過 import 關鍵字來引入包資源,簡化使用

PHP的namespace

namespace關鍵字

PHP通過 namespace 關鍵字來定義命名空間,對于多級命名空間,不同層級之間用 \ 分隔,比如:

namespace MyProject\Controllers;class MyClass1 {......
}

注:遵循 PSR-4 標準,使用首字母大寫(PascalCase)。

注意:namespace 后面不用加引號,但是 requireinclude 后面需要加引號,比如:

namespace MyProject\Controllers;require 'test0602_1.php';
......

實際上,PHP的namespace有兩種寫法,上面的寫法叫做非括號語法,還有一種寫法叫做括號語法,如下:

namespace MyProject1 {......
}

這兩種寫法,在同一個文件中不能混用。

推薦還是使用非括號語法,而且一個文件只用一個namespace。

括號語法的一個不同之處在于,可以顯式聲明一個全局命名空間,比如:

namespace {......
}

不加命名空間名字,就是全局命名空間。

在同一個文件里使用資源

首先,在同一個文件里,可以有多個namespace(這一點和Java不一樣),比如:

namespace MyProject1\Namespace1;......namespace MyProject2\Namespace2;......

或者:

namespace MyProject1\Namespace1 {......
}namespace MyProject2\Namespace2 {......
}

限定,完全限定,非限定

在使用另一個命名空間的資源時,可用下面三種方式:

  • 限定:有點類似于“相對路徑”,但貌似只能向下,不能向上(即找其父命名空間)
  • 完全限定:有點類似于“絕對路徑”,安全可靠
  • 非限定:不指定namespace信息(使用當前命名空間的資源,或者全局資源,或者資源的別名)
限定
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject1;
echo Namespace1\PI;

本例中,在 MyProject1 下,要使用 MyProject1\Namespace1 下的資源,可以直接從當前命名空間開始計算,因此只需指定 Namespace1 即可(開頭不加 \ )。

完全限定
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
echo \MyProject1\Namespace1\PI;

不管在哪里,要使用 MyProject1\Namespace1 下的資源,都可以從根命名空間開始計算,也就是以 \ 開頭,指定全路徑 \MyProject1\Namespace1

非限定
namespace {const E = 2.72;
}namespace MyProject1 {echo E;// echo \E;
}

本例中,因為要使用的是全局命名空間的資源,所以無需指定namespace。

當然,如果前面加上 \ ,顯式指定全局資源,也是OK的。

事實上,如果使用全局資源,加上 \ 會更安全一些,這是因為如果不加 \ ,會先查找當前命名空間,然后才是全局命名空間。

namespace MyProject1\Namespace1;
const M_PI = 3.14;
echo M_PI . PHP_EOL;
echo \M_PI . PHP_EOL;

輸出結果如下:

3.14
3.1415926535898

可見 M_PI\M_PI 是不同的,前者是當前命名空間的常量,后者是全局常量。

如果注釋掉第二行代碼,則 M_PI\M_PI 一樣,都是指向全局常量。

use關鍵字

使用其它命名空間的資源時,每次都要指定命名空間結構,太麻煩了。為了方便,可使用 use 關鍵字來簡化操作。

use 關鍵字有以下幾種使用方法:

  • 指定命名空間
  • 指定資源
  • 指定命名空間,并給命名空間起個別名
  • 指定資源,并給資源起個別名
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
use \MyProject1\Namespace1; // 指定命名空間
echo Namespace1\PI . PHP_EOL;namespace MyProject3\Namespace3;
use const \MyProject1\Namespace1\PI; // 指定資源
echo PI . PHP_EOL;namespace MyProject4\Namespace4;
use \MyProject1\Namespace1 as MyNamespace; // 指定命名空間,并給命名空間起個別名
echo MyNamespace\PI . PHP_EOL;namespace MyProject5\Namespace5;
use const \MyProject1\Namespace1\PI as MyPI; // 指定資源,并給資源起個別名
echo MyPI . PHP_EOL;

注意和Java的區別:Java的 import 指定的是資源(具體來說是類),比如 import java.util.* 或者 import java.util.ArrayList 。而PHP的 use 既可以指定命名空間,也可以指定資源。

PHP在use命名空間時,如果沒有起別名,則接下來使用命名空間的最后一部分(如上例中的 Namespace1 )來簡化命名空間全稱,如果有別名,則使用別名來簡化命名空間全稱。

同理,PHP在use資源時,如果沒有起別名,則接下來使用資源名(如上例中的 PI )來簡化其全限定名,如果有別名,則使用別名來簡化其全限定名。

此外要注意,PHP在use資源時,如果是常量,則需顯式指定 const (見上例)。類似的,如果是use一個方法,則需顯式指定 function

起別名的一個重要意義在于,如果引入多個相同非限定名的命名空間或者是引入同名資源,則需要通過別名來避免沖突。比如:

namespace MyProject1\Controller;
const E = 2.71;namespace MyProject2\Controller;
const E = 2.71828;namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
const PI = 3.14159;namespace MyProject3\Namespace3;
use \MyProject1\Controller as Controller1; // Controller有歧義,需用別名避免沖突
echo Controller1\E . PHP_EOL;use \MyProject2\Controller as Controller2; // Controller有歧義,需用別名避免沖突
echo Controller2\E . PHP_EOL;use const \MyProject1\Namespace1\PI as PI1; // PI有歧義,需用別名避免沖突
echo PI1 . PHP_EOL;use const \MyProject2\Namespace2\PI as PI2; // PI有歧義,需用別名避免沖突
echo PI2 . PHP_EOL;

use VS 直接指定資源

前面提到,直接指定資源限定名時:

  • \ 開頭:完全限定,從根命名空間開始計算
  • 不以 \ 開頭,非完全限定,從當前命名空間開始計算

在使用 use 關鍵字指定命名空間或資源時,無論是否以 \ 開頭,都是完全限定的。也就是說,一定是從根命名空間開始計算的。

namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject1;
echo Namespace1\PI . PHP_EOL; // 直接指定,不以 \ 開頭,非完全限定,從當前命名空間開始計算echo \MyProject1\Namespace1\PI . PHP_EOL; // 直接指定,以 \ 開頭,完全限定,從根命名空間開始計算use const MyProject1\Namespace1\PI as MyPI1; // 使用use, 不以 \ 開頭,完全限定,從根命名空間開始計算
echo MyPI1 . PHP_EOL;use const \MyProject1\Namespace1\PI as MyPI2; // 使用use, 以 \ 開頭,完全限定,從根命名空間開始計算
echo MyPI2 . PHP_EOL;

注:這種行為可能與PHP版本有關,我使用的PHP 8,也許舊版本不是這樣的,我沒有深究。

在不同的文件里使用

資源和使用者如果在不同的文件里,則使用者需要先引入資源所在的文件。在PHP里,是使用 include 或者 require 關鍵字來引入文件,具體參見我另一篇文檔( https://blog.csdn.net/duke_ding2/article/details/147690887 )。

但是,由于PHP的命名空間和實際目錄結構是相互獨立的,因此,引入文件后,仍需通過命名空間來指定資源。

  • test0602_1.php
namespace MyProject1\Namespace1;const PI = 3.14;
  • test0602_2.php
namespace MyProject2\Namespace2;require 'test0602_1.php';echo \MyProject1\Namespace1\PI;

同樣,也可使用 use 關鍵字來簡化操作。

test0602_2.php 改寫如下:

namespace MyProject2\Namespace2;require 'test0602_1.php';use const \MyProject1\Namespace1\PI;echo PI;

注意和Java對比:

  • Java只需 import (既指定目錄結構也指定包結構),PHP需要 requireuse (前者指定目錄結構,后者指定命名空間結構)
  • Java不用 import 也行,只需指定資源全稱。PHP可以不用 use ,只需指定資源或命名空間全稱,但是 require 是避免不了的(除非通過自動加載機制隱式加載),因為文件路徑和資源全稱是相互獨立的

總結

  • 使用 namespace 關鍵字來聲明命名空間,各級之間以 \ 分隔
  • 有“括號語法”和“非括號語法”兩種寫法,一般使用非括號語法,且一個文件只用一個namespace
  • 使用者可以通過“限定”、“完全限定”、“非限定”的方式來指定使用的命名空間
  • 命名空間結構和實際文件目錄結構可以不一致,但推薦保持一致
  • 通過 use 關鍵字來引入命名空間或者資源,簡化使用
  • 使用 use 指定的命名空間或資源,不管是否以 \ 開頭,實際都是從根命名空間開始計算的(至少PHP8是這樣)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82655.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

矩陣分解相關知識點總結(二)

文章目錄 三、矩陣的QR分解3.1、Givens矩陣與Givens變換3.2、Householder矩陣與Householder變換3.3、QR分解 書接上文矩陣分解相關知識點總結&#xff08;一&#xff09; 三、矩陣的QR分解 3.1、Givens矩陣與Givens變換 設非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及單…

Chorme如何對于youtube視頻進行畫中畫背景播放?

畫中畫可以讓你小窗播放&#xff0c;然后瀏覽器放后臺還可以做點別的事情。 B站直接可以選擇小窗播放&#xff0c;游覽器最小化就可以&#xff0c;但是youtube的小窗播放游覽器一切換就不顯示了。 其實是因為youtube的小窗播放不是真的小窗播放。要想真的實現需要在youtube視…

14.AI搭建preparationのBERT預訓練模型進行文本分類

一、回顧&#xff1a; 對深度學習框架Python2.0進行自然語言處理有了一個基礎性的認識注意力模型編碼器(encoder_layer,用于分類的全連接層dense_layer)&#xff0c;拋棄了傳統的循環神經網絡和卷積神經網絡&#xff0c;通過注意力模型將任意位置的兩個單詞的距離轉換成1編碼器…

OD 算法題 B卷【最長公共前綴】

文章目錄 最長公共前綴 最長公共前綴 編寫一個函數來查找字符串數組 中的最長公共前綴&#xff0c;如果不存在公共前綴&#xff0c;返回字符串’Zero’字符串長度范圍【2,1000】&#xff0c;字符串中字符長度范圍為【1,126】 示例1 輸入&#xff1a; [“flower”, “flow”, …

pycharm F2 修改文件名 修改快捷鍵

菜單&#xff1a;File-> Setting&#xff0c; Keymap中搜索 Rename&#xff0c; 其中&#xff0c;有 Refactor-> Rename&#xff0c;右鍵添加快捷鍵&#xff0c;F2&#xff0c;刪除原有快捷鍵就可以了。

WEB安全--SQL注入--bypass技巧2

繼之前文章的補充&#xff1a; WEB安全--SQL注入--bypass技巧_sql注入過濾空格-CSDN博客 Q1&#xff1a;發現sql注入的時間盲注時&#xff0c;如果時間盲注的函數都被過濾了&#xff0c;怎么辦&#xff1f; 除了找其他函數替換、編碼等方式&#xff0c;還有以下方式繞過&…

自定義事件wpf

// 自定義控件 public class MyCustomControl : Control { public static readonly RoutedEvent MyCustomEvent EventManager.RegisterRoutedEvent( "MyCustom", RoutingStrategy.Bubbling, typeof(RoutedEventHandler), typeof(MyCustomControl) ); public event R…

【匯編逆向系列】一、無參數的函數調用- RSP,EAX寄存器,全局變量,INT類型和MOV,INC,SHL指令

給出一段簡單的匯編 no_params_function:0000000000000000: 40 57 push rdi0000000000000002: 8B 05 00 00 00 00 mov eax,dword ptr [global_counter]0000000000000008: FF C0 inc eax000000000000000A: 89 05 00 00 00 0…

知識蒸餾:從模型輸出到深層理解

1. 概念闡釋: 還記得上次說的“老師教你畫畫,不只教‘貓’,還教‘像狗像樹葉’的細微感覺”嗎?那是最初的蒸餾。 后來大家發現,老師不僅僅通過“最后畫出來像什么”來教你。 有時候,老師是教你“他畫畫時,哪里用了力氣,哪里畫得特別認真”(這叫基于特征的蒸餾,學習…

vue-18(使用 Vuex 插件實現高級功能)

使用 Vuex 插件實現高級功能 Vuex 插件提供了一種強大的方式來擴展 Vuex 存儲的功能。它們為存儲的變更過程提供了鉤子&#xff0c;允許你攔截變更、執行副作用以及添加自定義邏輯。本章將探討如何利用 Vuex 插件實現持久化、日志記錄和時間旅行調試等高級功能。我們將深入研究…

【Java】CopyOnWriteArrayList

一&#xff0c;概述 CopyOnWriteArrayList作為List接口的實現之一&#xff0c;它區分于ArrayList在于它是線程安全的。如它名字一樣&#xff0c;所有的寫操作均復制了原數組的值&#xff0c;雖說代價較大&#xff0c;但讀多寫少的環境下&#xff0c;是可接受的。筆者在此簡單看…

【高等數學】函數項級數

目錄 函數項級數收斂域的定義收斂域的判定方法常見冪級數展開&#xff08;麥克勞林級數&#xff09;冪級數的應用 傅里葉級數傅里葉級數的基本概念傅里葉級數的主要性質奇偶函數的簡化周期延拓奇延拓偶延拓 函數項級數 函數項級數是指由一系列函數構成的無窮級數&#xff0c;形…

基于cornerstone3D的dicom影像瀏覽器 第二十八章 LabelTool文字標記,L標記,R標記及標記樣式設置

文章目錄 前言一、L標記、R標記二、修改工具樣式1. 樣式的四種級別2. 導入annotation3. 示例1 - 修改toolGroup中的樣式4. 示例2 - 修改viewport中的樣式 三、可配置樣式 前言 cornerstone3D 中的文字標記工具LabelTool&#xff0c;在添加文字標記時會彈出對話框讓用戶輸入文字…

PPT轉圖片拼貼工具 v4.3

軟件介紹 這個軟件就是將PPT文件轉換為圖片并且拼接起來。 效果展示 支持導入文件和支持導入文件夾&#xff0c;也支持手動輸入文件/文件夾路徑 軟件界面 這一次提供了源碼和開箱即用版本&#xff0c;exe就是直接用就可以了。 軟件源碼 import os import re import sys …

新版NANO下載燒錄過程

一、序言 搭建 Jetson 系列產品燒錄系統的環境需要在電腦主機上安裝 Ubuntu 系統。此處使用 18.04 LTS。 二、環境搭建 1、安裝庫 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建環境的過程需要這個應用庫來將某些 NVIDIA 軟件組件安裝到 Je…

神經網絡-Day45

目錄 一、tensorboard的基本操作1.1 發展歷史1.2 tensorboard的原理 二、tensorboard實戰2.1 cifar-10 MLP實戰2.2 cifar-10 CNN實戰 在神經網絡訓練中&#xff0c;為了幫助理解&#xff0c;借用了很多的組件&#xff0c;比如訓練進度條、可視化的loss下降曲線、權重分布圖&…

設計模式之單例模式(二): 心得體會

設計模式之單例模式(一)-CSDN博客 目錄 1.背景 2.分析 2.1.違背面向對象設計原則&#xff0c;導致職責混亂 2.2.全局狀態泛濫&#xff0c;引發依賴與耦合災難 2.3.多線程場景下風險放大&#xff0c;性能與穩定性受損 2.4.測試與維護難度指數級上升 2.5.違背 “最小知識原…

windows10 php報錯

參考這個&#xff0c; 實際解決了問題&#xff0c; 主要是repair c 然后重啟 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU顯存的作用和如何選擇

核心定義與作用 首先&#xff0c;顯存的全稱是顯示內存&#xff0c;英文是Video RAM或VRAM&#xff0c;是顯卡上的專用內存。 顯存的主要作用是用來存儲圖形處理單元&#xff08;GPU&#xff09;需要處理的數據&#xff0c;比如紋理、頂點數據、幀緩沖區等。 數據中轉站 GPU…

從零開始:用Tkinter打造你的第一個Python桌面應用

目錄 一、界面搭建:像搭積木一樣組合控件 二、菜單系統:給應用裝上“控制中樞” 三、事件驅動:讓界面“活”起來 四、進階技巧:打造專業級體驗 五、部署發布:讓作品觸手可及 六、學習路徑建議 在Python生態中,Tkinter就像一把瑞士軍刀,它沒有花哨的特效,卻能快速…