思緒凌亂了,原來非靜態方法也可以靜態調用(轉)

来源:http://www.cnblogs.com/yaozhengqi/archive/2016/06/21/5603088.html
-Advertisement-
Play Games

1.PHP中可以靜態調用非靜態方法麽? 今天我被問到PHP中可不可以使用 className::methodName() 的方法來調用一個沒有聲明Static的方法。在我的印象中,我好像是見過這種用法,但又有些不確定。大家都知道,在手冊或者教程里,方法被分為靜態方法和非靜態方法,通常我們靜態調用的方 ...


1.PHP中可以靜態調用非靜態方法麽?

今天我被問到PHP中可不可以使用 className::methodName() 的方法來調用一個沒有聲明Static的方法。在我的印象中,我好像是見過這種用法,但又有些不確定。大家都知道,在手冊或者教程里,方法被分為靜態方法和非靜態方法,通常我們靜態調用的方法,肯定是靜態方法。

那如果我們調用了非靜態方法會怎麼樣呢?首先做測試.
<?php
class test{
function test(){
echo 'it works';
}
}
test::test();

執行以下,返回錯誤如下
Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php
on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0

這個時候,可能大家就會認為靜態調用非靜態方法是行不通的了,但其實,結論下的過早了,因為test()這個方法比較特殊,與類同名,是構造方法。

我們繼續測試。
<?php
class test{
function test(){
echo 'it works';
}
function test2(){
echo 'it works too';
}
}
test::test2();

執行結果:
it works too
這說明,靜態調用非靜態方法是可行的,但是靜態調用構造方法是不可以的。為了驗證這個結論,我又做瞭如下測試:
<?php
class test{
static function test(){
echo 'it works';
}
}
test::test();

執行的結果如下:
Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9
構造方法不能聲明靜態,所以上面的推論正確。

但這個結果的確是很特殊的,因為可能只有PHP可以靜態調用非靜態方法,我用Java做了實驗,如果靜態調用非靜態方法會報如下錯誤:
Cannot make a static reference to the non-static method showString() from the type HelloWorldApp
其他語言我沒有一一嘗試,但這已經足夠來說明PHP的特殊之處,關於為什麼PHP會有這樣的情況我暫時沒有找到相關說明。

2.靜態調用非靜態方法是否應該被應用?

那我們是不是可以使用這種方法來代替static方法呢? 首先在代碼的可讀性上來看,靜態調用非靜態方法當然是不被推薦的,這會讓維護者產生疑惑。

接下來我們再做一些實驗,來看一下靜態調用非靜態方法在效率上是否會有一定的優勢。
<?php
class test{function test2(){}}
for($k=0; $k<10000; $k++)
{
test::test2();
}

上面代碼在我這裡的執行時間是18到28毫秒,我們再來測試標準的寫法。
<?php
class test{static function test2(){}}
for($k=0; $k<10000; $k++)
{
test::test2();
}

上面的代碼執行時間在5到10毫秒之間,這樣看來,靜態調用非靜態方法的效率要比標準的靜態方法調用低的多,所以在效率上也不推薦靜態調用非靜態方法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境說明:EntityFramework 6.1.3和.Net Framework4.5性能註意事項:https://msdn.microsoft.com/zh-cn/library/cc853327.aspx比較精髓的一點:查詢執行的各個階段中的準備查詢,每個唯一查詢一次。包括編寫查詢命令、基於模 ...
  • 另外,有時候可能需要轉換成字典處理,則list(set(['a','b'])) ...
  • Java只支持單繼承,但是我們在應用中需要類的多繼承,由此Java中就提供了實現介面的方法來實現多繼承。 介面的本質——介面是一種特殊的抽象類,這種抽象類裡面只包含常量和方法的定義,而沒有變數和方法的實現。 介面總結:介面和介面之間可以相互繼承,類和類之間可以相互繼承,類和介面之間,只能是類來實現接 ...
  • 課本源碼部分 第9章 查找 - B樹 ——《數據結構》-嚴蔚敏.吳偉民版 源碼使用說明 鏈接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明 課本源碼合輯 鏈接☛☛☛ 《數據結構》課本源碼合輯 習題集全解析 鏈接☛☛☛ 《數據結構題集》習題解析合輯 本源碼引入的文件 鏈 ...
  • http://jingyan.baidu.com/article/f3e34a128551b7f5ea653544.html bin目錄主要是用來存放tomcat的命令,主要有兩大類,一類是以.sh結尾的(linux命令),另一類是以.bat結尾的(windows命令)。 logs目錄用來存放tom ...
  • 課程簡介 * 正則表達式是軟體開發必須掌握的一門語言,掌握後才能很好地理解到它的威力; * 課程採用概念和實驗操作 4/6 分隔,幫助大家理解概念後再使用大量的實例加深對概念的理解; * 實例操作是對概念最好的理解,也是學習新語言最有效的辦法; * 在課程中也穿插著大量軟體開發的技巧和大家分享; *... ...
  • PHP分頁代碼在各種程式開發中都是必須要用到的,在網站開發中更是必選的一項。要想寫出分頁代碼,首先你要理解SQL查詢語句:select * from goods limit 2,7。PHP分頁代碼核心就是圍繞這條語句展開的,SQL語句說明:查詢goods數據表從第2條數據開始取出7條數據。在分頁代碼 ...
  • 1. 從Python官網到獲取Python3的包, 切換到目錄/usr/local/src 2. 使用命令如下命令進行解壓縮: 3. 在/usr/local路徑下創建目錄--python3.5, 為第4步的安裝目錄 4. 編譯安裝 5. 進入安裝的絕對路徑,檢查是否安裝成功 6.查看環境變數,啟動p ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...