国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > PHP > 正文

PHP靜態(tài)調(diào)用非靜態(tài)方法的應(yīng)用分析

2024-05-04 23:07:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

靜態(tài)調(diào)用非靜態(tài)方法!!這在java,c#中是不可想象的,也是絕對(duì)不行的。這樣的錯(cuò)誤在這些語(yǔ)言中會(huì)在編譯階段就被指出錯(cuò)誤的。但是對(duì)于php這樣的動(dòng)態(tài)語(yǔ)言呢?首先這個(gè)是語(yǔ)法沒有錯(cuò)誤的,php –l 找不出錯(cuò)誤來(lái)的。如果運(yùn)行呢?
先看一個(gè)例子

復(fù)制代碼 代碼如下:


<?php
class myClass
{
private $name = "myClass";

public function echoName(){
echo $this->name;
}

public function getName(){
$this->echoName();
}
}

class newClass
{
private $name = "newClass";

public function echoName(){
echo $this->name;
}

public function test() {
myClass::getName();
echo "/n";
}
}

$app = new newClass();
$app->test();


這個(gè)代碼的最終調(diào)用結(jié)果是什么呢?(運(yùn)行環(huán)境PHP 5.3.10 )

PHP靜態(tài)調(diào)用非靜態(tài)方法的應(yīng)用分析

看這個(gè)結(jié)果,有幾個(gè)地方值得注意:

首先是myClass::getName() 這是一個(gè)靜態(tài)函數(shù)的調(diào)用
但是看一下myClass的getName()函數(shù),它卻并不是一個(gè)靜態(tài)函數(shù)。

其次返回的結(jié)構(gòu)
先是返回PHP Strict Standards Error。熟悉php的人應(yīng)該知道,Strict Error是php的編碼標(biāo)準(zhǔn)化警告,一般是由于php為了保持向前兼容而報(bào)出的錯(cuò)誤。那這么說(shuō),非靜態(tài)函數(shù)的靜態(tài)調(diào)用在php5.3之前的某個(gè)版本是允許的,只是在后面的版本是不被建議使用!!

好了,如果你現(xiàn)在將Strict Error在error_reporting中注釋掉,返回結(jié)果就變成了newClass!!

在php4版本的時(shí)候,子類需要調(diào)用父類的方法,但是子類又有一個(gè)同名的方法,因此不能使用$this,于是php4提供了(parentClassName::method())這樣的方法。(當(dāng)然php5增加了parent這個(gè)關(guān)鍵字)

但是php4提供的這個(gè)方法實(shí)際上就是允許了靜態(tài)調(diào)用一個(gè)非靜態(tài)方法!!后臺(tái)由于需要向前兼容的原因,這個(gè)特性也就變成了不能刪除的特性了(必須保證前面版本的代碼能在后一版本的php環(huán)境中運(yùn)行)。

只是增加了Strict Error來(lái)對(duì)這種調(diào)用進(jìn)行提示。

底層實(shí)現(xiàn)原因
好了,對(duì)于為什么會(huì)出現(xiàn)這個(gè)情況的實(shí)現(xiàn)原因, 鳥哥的這篇文章有說(shuō)明

首先需要顛覆自己的觀點(diǎn),什么是靜態(tài)調(diào)用?并不是說(shuō)有::就是靜態(tài)調(diào)用,而是看calling scope。

“ $this指針指向的對(duì)象就是這個(gè)方法被調(diào)用時(shí)刻的calling scope.”

我換一種句子翻譯:

靜態(tài)調(diào)用是沒有calling scope的,非靜態(tài)調(diào)用$this->abc() 中的$this指向的對(duì)象就是calling scope。

Calling scope是當(dāng)每一句調(diào)用的時(shí)候被傳遞的。

理解下面的代碼:

復(fù)制代碼 代碼如下:


<?php
class A {
public function __construct() {
}
}
class B extends A {
public function __construct() {
parent::__construct();
}
}


這里的parent::_construct()是子類將calling scope轉(zhuǎn)化為父類A的calling scope。這個(gè)并不是靜態(tài)調(diào)用。

回到最上面的例子
myClass::getName();

這個(gè)時(shí)候由于沒有使用parent這樣的關(guān)鍵字,也沒有對(duì)$this重新賦值,因此calling scope并沒有改變,仍然是$app。就是說(shuō)這個(gè)時(shí)候,所有出現(xiàn)的$this指針都是指向$app的。

好了,下面的事情就很好理解了, echo $this->name; 自然就是調(diào)用calling scope的name屬性了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新营市| 和政县| 定安县| 靖宇县| 女性| 肥乡县| 福建省| 乌鲁木齐市| 临漳县| 扬州市| 遂溪县| 新化县| 通城县| 望城县| 凤庆县| 桐柏县| 庄河市| 东兰县| 舞钢市| 毕节市| 上虞市| 美姑县| 耿马| 潞城市| 通化县| 建德市| 木里| 井陉县| 盐山县| 黔南| 五家渠市| 寿光市| 星子县| 九台市| 关岭| 金昌市| 广安市| 环江| 禄劝| 醴陵市| 扎鲁特旗|