php中延迟绑定,PHP静态延迟绑定
靜態延遲綁定的概念
PHP版本5.3起增加了靜態延遲綁定,也稱遲綁定,主要用于在繼承范圍內引用靜態調用的類。簡單地來說:static::不再被解析為當前方法所定義的類,而是在實際運行時計算的。
// 意外的繼承
class Person
{
public static $name = 'Person';
public static function say()
{
return self::$name;
}
}
class Man extends Person
{
public static $name = 'Man';
}
echo Man::say();// Person
在這個例子中,say()方法使用了 self 關鍵字,指的是 Person 類而不是 Man 類,所以 Person::say() 方法中無法訪問靜態變量最終值,但是有了靜態延遲綁定,這個問題就可以得到解決了。
靜態延遲綁定
class Person2
{
public static $name = 'Person';
public static function say()
{
return static::$name;// 后期靜態綁定從這里開始
}
}
class Man2 extends Person2
{
public static $name = 'Man';
}
echo Man2::say();// Man
添加了靜態延遲綁定后,當 Man2 調用靜態方法 say() 時,static:: 會被解析為 Man2,而不是 say() 方法的定義類 Person。
靜態延遲綁定轉發
如果靜態方法調用 parent:: 或者 self::,將轉發調用信息。
// 官網示例:
class A
{
public static function foo()
{
static::who();
}
public static function who()
{
echo __CLASS__."\n";
}
}
class B extends A
{
public static function test()
{
A::foo();
parent::foo();
self::foo();
}
public static function who()
{
echo __CLASS__."\n";
}
}
class C extends B
{
public static function who()
{
echo __CLASS__."\n";
}
}
C::test();// A C C
當調用 A::foo()時,static::解析到的是 A,
當調用 parent:: 和 self:: 時,因為轉發機制,static::被解析為當前實際調用類,也就是 C ,所以 parent::foo() = ‘C’,self::foo() = ‘C’
PHP靜態延遲綁定和普通靜態效率簡單對比
只是一個簡單的小實驗,對比了下 延遲綁定 和 非延遲的效率 延遲綁定主要就是使用 static 關鍵字來替代原來的 self ,但功能非常強大了 實驗代碼: class A { protected s ...
PHP靜態延遲綁定簡單示例
沒怎么用過這個新特性,其實也不算新啦,試試吧,現在靜態類的繼承很方便了 <?php class A { protected static $def = '123456'; public stat ...
PHP靜態延遲綁定簡單演示樣例
沒怎么用過這個新特性.事實上也不算新啦,試試吧,如今靜態類的繼承非常方便了 <?php class A { protected static $def = '123456'; public st ...
PHP 面向對象編程和設計模式 (2/5) - 靜態變量、屬性和方法及延遲綁定
PHP高級程序設計 學習筆記 2014.06.10 Static(靜態)關鍵字用來定義靜態方法和屬性,static 也可用于定義靜態變量以及后期靜態綁定. 1.靜態變量?static variable ...
Atitit 延遲綁定架構法attilax總結
Atitit 延遲綁定架構法attilax總結 配置文件的延遲綁定1 Api屬性與方法的回調延遲綁定1 后期綁定和前期綁定2 延遲調用2 用 Java 語言延遲綁定2 什么是推遲綁定 C++3 配置文 ...
python 延遲綁定
def multipliers(n): funcs = [] for i in range(n): def f(x): return x * i funcs.append(f) return func ...
Scala學習之延遲綁定
package com.swust.example object TraitDemo2 extends App{ //抽象類 abstract class Writer { def writeMess ...
ELF 文件 動態連接 - 延遲綁定(PLT)
PLT 全稱:Procedure Linkage Table ,直譯:過程連接表 由于在動態連接中,程序的模塊之間包含了大量的函數引用,所以在程序開始執行前,動態鏈接會耗費較多的時間用于模塊之間函數引 ...
python閉包和延遲綁定
一.什么是閉包: 1.函數內定義函數. 2.外函數的返回時內函數的引用. 3.內函數使用外函數的局部變量(至少一個). 1 def outfunc(): 2 for num in range(4): ...
隨機推薦
MySql 中文亂碼排查解決方案
MySQL會出現中文亂碼的原因不外乎下列幾點: server本身設定問題,例如還停留在latin1 table的語系設定問題(包含character與collation) 客戶端程式(例如php)的連 ...
重新想象 Windows 8 Store Apps (59) - 鎖屏
[源碼下載] 重新想象 Windows 8 Store Apps (59) - 鎖屏 作者:webabcd 介紹重新想象 Windows 8 Store Apps 之?鎖屏 登錄鎖屏,獲取當前程序的鎖 ...
java poi導入EXCEL xls文件代碼
/** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...
關于國際化中的$NON-NLS-1$
百度百科解釋: 這實際與eclipse中支持i18n的一種方式,eclipse的標準結構,將所有string常量定義到·properties中,例如下面程序段中的TestRef.hello實際上是·p ...
[開發環境] Ubuntu12.04 Telnet服務設置
Ubuntu12.04默認未啟用Telnet服務,配置Telnet服務步驟如下: 1. 安裝和配置 安裝openbsd-inetd: #sudo apt-get install openbsd-ine ...
BitmapFactory.decodeResource(res, id); 第一個參數跟第二個參數有什么關系?
BitmapFactory.decodeResource(res, id); res= getResources();activity的方法 id = R.drawable.x
[ SSH框架 ] Hibernate框架學習之二
一.Hibernate持久化類的編寫規范 1.什么是持久化類 Hibernate是持久層的ORM影射框架,專注于數據的持久化工作.所謂持久化,就是將內存中的數據永久存儲到關系型數據庫中.那么知道了什么 ...
實戰ELK(5) Logstash 入門
Logstash 是一個開源的數據收集引擎,它具有備實時數據傳輸能力.它可以統一過濾來自不同源的數據,并按照開發者的制定的規范輸出到目的地. 一.原理 Logstash 通過管道進行運作,管道有兩個必 ...
centos靜態綁定IP地址
Centos7 /etc/sysconfig/network-scripts/ifcfg-ens33
自定義服務與調用--------factory
自定義服務: angular.module('myApp').factory('UserService',['$http','$q',function ($http,$q) { // 定義一個方法工廠 ...
總結
以上是生活随笔為你收集整理的php中延迟绑定,PHP静态延迟绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php之二叉树,PHP构造二叉树算法示例
- 下一篇: java的轻量锁,jvm第7节-锁(偏向