導讀跟大家講解下有關php中static的說明和用法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說php中static的說明和用法,小編也
跟大家講解下有關php中static的說明和用法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說php中static的說明和用法,小編也收集到了有關php中static的說明和用法的相關資料,希望大家看到了會喜歡。
* 細說static* 一、用途:
* 1.類中聲明靜態成員
* 2.函數中聲明靜態變量
* 3.后期靜態綁定
*
* 二、特點:
* 1.靜態成員屬于類,必須用類訪問
* 2.靜態方法比較特殊,允許用對象訪問,但不推薦
* 3.必須使用范圍解析符::訪問,不允許使用對象訪問符->訪問
* 4.靜態屬性僅允許使用字面量(字符/數值/數組)或常量進行初始化(禁止表達式/變量/對象)
*
* 三、后期靜態綁定/延遲靜態綁定
* 注:php.net官網上有介紹非常的晦澀難懂,這里做一個簡化說明
* 1. 轉發調用是什么?
* 答:說人話,就是以回調的方式來執行靜態方法,用回調就必須指定調用者或代理函數。
* 調用者可以是self,parent,static
* 代理函數有很多:
* forward_static_call(callable,arg1...)
* forward_static_call_array(callable,array)
* call_user_func(callable,arg1...)
* call_user_func_array(callable,array)
class Demo1 { public static function test1() { //返回參數:func_get_args(void )返回參數數組 return implode(',', func_get_args()); } //后期靜態綁定(最后再創建這個父類方法用來教學) public static function test3() { //調用當前類的靜態方法// return self::test1('php','mysql','thinkphp'); //使用static,動態判斷是哪個類在調用test1()方法 //類方法的調用者,在聲明時指定,是前期調用,在編譯階段完成 //類方法的調用者,在執行時指定,是后期調用,在運行階段完成 return static::test1('php','mysql','thinkphp'); }}class Demo2 extends Demo1 { //重寫父類靜態方法 public static function test1() { return __METHOD__; } public static function test2() { //1.傳統調用父類靜態方法 return parent::test1('php中文網'); //2.用代理函數調用父類靜態方法 //return forward_static_call(['Demo1','test1'],'Hello','PHP中文網'); //下call_user_func()功能完全一樣 //return call_user_func(['Demo1','test1'],'Hello','PHP中文網'); //調用本類的靜態方法 //return forward_static_call(['Demo2','test1']); //如果第一個參數是一個字符串,是指一個全局函數,不屬于任何類 //return forward_static_call('test3','www.php.cn'); } }//創建一個外部函數function test3(){ return '我是類外部定義的一個函數,'. func_get_arg(0);}//echo Demo2::test2();//后期靜態綁定//用Demo2類靜態調用test3(),而test3()中調用了本類的test1()echo Demo2::test3();/** * 分析 * 1. test3()方法在Demo1類中 * 2. Demo2類繼承自Demo1,所以可以用Demo2訪問test3() * 3. test3()中訪問了當前類的test1()方法,當然是Demo1類的test1() * 4. 但是我是用Demo2類調用的test3(),因此我的本意,肯定是想調用Demo2中重載的test1() * 5. 那么,如果能讓當前靜態方法的調用者,根據繼承關系的上下文自動進行判斷呢? * 6. 在靜態方法前使用static關鍵字,這樣就可以自動判斷是哪個類在調用我了~~ * 7. 運行時會自動將static,替換成Demo2類 */echo '<hr>';//思考:在Demo1中調用test3()會輸出什么結果?echo Demo1::test3();* 1.會輸出Demo1類中的test1()方法的運行結果
* 2.因為當前調用者是Demo1,運行時會自動將static替換成Demo1
以上就是php中static的說明和用法的詳細內容,更多請關注php中文網其它相關文章!
來源:php中文網