這篇文章將為大家詳細講解有關PHP中Class self與static有哪些區(qū)別,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)是專業(yè)的興隆網(wǎng)站建設公司,興隆接單;提供網(wǎng)站設計制作、成都網(wǎng)站設計,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行興隆網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
對于大多數(shù) PHPer 來說,self 與 static 兩個 PHP 關鍵詞都不算陌生。我們學會通過self::xxxx
這種方式來調用當前類的靜態(tài)屬性和方法。而 static 呢?想必很多人只知道它是用于定義一個靜態(tài)方法和類屬性關鍵詞。
這也是我之前的認知。
現(xiàn)在我們來回顧一下這兩個關鍵詞的一些常見用法:
// self 用法 1 :調用靜態(tài)成員屬性 <?php class Person { protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。 public function test() { echo self::$maxAddressCount; } } $person = new Person(); $person->test();
// self 用法 2 :調用靜態(tài)方法 <?php class Person { protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。 protected static function getMaxAddressCount() { return self::$maxAddressCount; } public function test() { echo self::getMaxAddressCount(); } } $person = new Person(); $person->test();
// self 用法 3 :創(chuàng)建一個當前對象 <?php // 單例示例 class Person { private static $instance = null; private function __construct() {} final public static function getInstance() { if (self::$instance == null) { self::$instance = new self; } return self::$instance; } public function test() { echo "hello world!"; } } $person = Person::getInstance(); $person->test();
關于 static 關鍵詞的常見用法也在上面 3 個示例中得到綜合體現(xiàn)。
我深信上面的用法,任何一個入門的 PHPer 都是非常熟悉的。現(xiàn)在我要講的是以下兩種方式:
new self() 與 new static() 的區(qū)別?
我相信很多人都知道new self()
創(chuàng)建一個當前類的對象,并不知道new static()
也能創(chuàng)建一個當前類的對象。
關于new static()
這種用法呢,在官方文檔有說明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php
PHP 官方把這種方式稱為:后期靜態(tài)綁定。
官方示例 1:
<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test();
因為 Class B 繼承了 Class A。 A 與 B 都有一個靜態(tài)方法who()
。此時通過B::test()
的時候,調用的實際上是 Class A 的who()
方法。
因為子類 Class B 的靜態(tài)方法who()
屬于在 Class A 之后的子類里面才定義的。而 PHP 的默認特性只允許調用最先定義的。
就這引出了后期靜態(tài)綁定的概念。
官方示例 2:
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期靜態(tài)綁定從這里開始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test();
我們把 Class A 里面的test()
方法體的self
更改為static
之后,static 代表的永遠是指向調用類。也就是說雖然在 Class A 父類里面定義的方法與子類有同名沖突的情況。但是,當子類調用的時候,那么自動切換到子類的靜態(tài)同名方法。取決于調用者。
大家可以通過運行以上兩個示例進行理解。
之所以會有本篇小節(jié)內容。是因為我在實際運行當中要繼承單例方法導致了這個問題。所以,才牽扯出這個特性。
關于“PHP中Class self與static有哪些區(qū)別”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)頁題目:PHP中Classself與static有哪些區(qū)別
網(wǎng)站鏈接:http://muchs.cn/article22/ghiecc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、自適應網(wǎng)站、商城網(wǎng)站、面包屑導航、ChatGPT、電子商務
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)