PHP基礎補全系列 static

2021-07-25 04:21:37 字數 2326 閱讀 6969

昨天晚上睡了大概兩個小時。感覺今天一天整個人的狀態都特別萎靡。    

在手冊中,static主要實現兩個作用,1.定義靜態變數和靜態方法;2.實現後期靜態繫結(延遲靜態繫結)

定義靜態變數和靜態方法主要是需要注意宣告和呼叫的方式。

1.手冊中提到靜態屬性不能使用表示式宣告。這個並不嚴謹,實際測試使用類似於 2+3 或者 "hello "."world" 這種方式宣告,雖然編輯器報警,但是實際執行沒有問題。如果使用函式或者變數宣告,則直接報錯

2.靜態方法可以通過物件呼叫,但是靜態屬性不能。

3.在函式中的靜態變數,在程式離開函式後,靜態變數的值不丟失。

具體見**:

<?php

error_reporting(e_all);

class teststatic

}//手冊中提到靜態屬性不能通過表示式初始化,但是teststatic::$b和teststatic::$c編輯器報警,執行正常.teststatic::$d報錯.

teststatic::test(); //teststatic::$a,teststatic::$b,teststatic::$c可以正常輸出,$d報錯

$temp = new teststatic();

//靜態屬性不能通過物件訪問

echo $temp->a;//報錯

//靜態方法可以通過物件訪問

$temp->test();//正常

//可以在函式內部宣告靜態變數,當程式執行離開函式後,靜態變數的值不丟失

function teststaticvaribale ()

teststaticvaribale();//輸出1

teststaticvaribale();//輸出2

//基於這個原因,可以通過使用靜態變數來寫遞迴(不過個人認為這並不是太好的實踐)

function dfs ()

dfs();//輸出 12345678910

在c語言中,static宣告的全域性變數和函式都只能在當前宣告的原始檔內呼叫,在php中沒有發現這個限制。

編寫in.php檔案如下:

<?php

$a = "hello,world\n";

static $b = "hello,world\n";

編寫out.php檔案如下:

<?php

require_once "in.php";

function test ()

//在c語言中static關鍵字限制了生命的靜態全域性變數和靜態函式只在宣告的檔案內有效,在其他檔案中不能使用.

//在php中我測試的結果沒有這個問題,下面三個語句輸出結果均正常.

echo $a;//輸出 hello,world

echo $b;//輸出 hello,world

test();//輸出 hello,world

static的另乙個作用是實現後期延遲繫結,這裡援引手冊中的解釋如下:

準確說,後期靜態繫結工作原理是儲存了在上乙個「非**呼叫」(non-forwarding call)的類名。當進行靜態方法呼叫時,該類名即為明確指定的那個(通常在 :: 運算子左側部分);當進行非靜態方法呼叫時,即為該物件所屬的類。所謂的「**呼叫」(forwarding call)指的是通過以下幾種方式進行的靜態呼叫:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函式來得到被呼叫的方法所在的類名,static:: 則指出了其範圍。

該功能從語言內部角度考慮被命名為「後期靜態繫結」。「後期繫結」的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際執行時計算的。也可以稱之為「靜態繫結」,因為它可以用於(但不限於)靜態方法的呼叫。

樣例見**:

<?php

//通過static可以實現後期靜態繫結(有些地方成為延遲靜態繫結)

class daddy

}class son extends daddy

daddy::getclassname();//輸出 daddy

son::getclassname();//輸出 daddy

class daddy_1

public static function test ()

}class son_1 extends daddy_1

}daddy_1::test();//輸出daddy_1

son_1::test();//輸出son_1

渾身難受,今天回去得早點兒休息。

PHP基礎補全系列 異常處理

異常處理在php裡也是個很有爭議的問題,記得之前做專案的時候,關於異常處理和當時的同事討論了很久。不過今天不討論這些東西,只是單純做個記錄。這篇部落格分三個部分 異常處理的基本使用 擴充套件中丟擲的異常,以pdo舉例 將錯誤資訊委託給異常處理 一些需要注意的tips 異常處理的基本使用 需要注意以下...

運維安全系列基礎服務之 FTP 服務(系列一)

今天主要講的是基礎服務裡面的 ftp服務 ftp 檔案傳輸協議 英文 file transfer protocol,縮寫 ftp 是用於在網路上進行檔案傳輸的一套標準協議。它屬於網路傳輸協議的應用層。ftp 是乙個8位的客戶端 伺服器協議,能操作任何型別的檔案而不需要進一步處理,就像 mime 或 ...

運維安全系列基礎服務之 FTP 服務(系列一)

做了多年運維工程師,積攢了一些經驗,和大家分享下。個人認為,運維安全話題的系列,主要包括下面四個方面 今天主要講的是基礎服務裡面的ftp服務。檔案傳輸協議 英文 file transfer protocol,縮寫 ftp 是用於在網路上進行檔案傳輸的一套標準協議。它屬於網路傳輸協議的應用層。ftp ...