佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中的self、static、parent關(guān)鍵字用法分析

PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中的self、static、parent關(guān)鍵字用法分析

熱門標(biāo)簽:科大訊飛語音識(shí)別系統(tǒng) 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 阿里云 Linux服務(wù)器 團(tuán)購網(wǎng)站 服務(wù)器配置 電子圍欄

本文實(shí)例講述了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中的self、static、parent關(guān)鍵字用法.分享給大家供大家參考,具體如下:

看到php里面有關(guān)于后期靜態(tài)綁定的內(nèi)容,雖然沒有完全看懂,但是也收獲不少東西。

php官方手冊(cè)介紹:
http://php.net/manual/zh/language.oop5.late-static-bindings.php

不存在繼承的時(shí)候

不存在繼承的意思就是,就書寫一個(gè)單獨(dú)的類來使用的時(shí)候。self和static在范圍解析操作符 (::) 的使用上,并無區(qū)別。

  • 在靜態(tài)函數(shù)中,self和static可以調(diào)用靜態(tài)屬性和靜態(tài)函數(shù)(沒有實(shí)例化類,因此不能調(diào)用非靜態(tài)的屬性和函數(shù))。
  • 在非靜態(tài)函數(shù)中,self和static可以調(diào)用靜態(tài)屬性和靜態(tài)函數(shù)以及非靜態(tài)函數(shù)

此時(shí),self和static的表現(xiàn)是一樣的,可以替換為該類名::的方式調(diào)用。

?php
class Demo{
 public static $static;
 public $Nostatic; 
 public function __construct(){
  self::$static = "static";
  $this->Nostatic = "Nostatic";
 }
 public static function get(){
  return __CLASS__;
 }
 public function show(){
  return "this is function show with ".$this->Nostatic;
 }
 public function test(){
  echo Demo::$static."br/>"; //使用類名調(diào)用靜態(tài)屬性
  echo Demo::get()."br/>"; //使用類名調(diào)用靜態(tài)屬性
  echo Demo::show()."br/>"; //使用類名調(diào)用靜態(tài)屬性
  echo self::$static."br/>"; //self調(diào)用靜態(tài)屬性
  echo self::show()."br/>"; //self調(diào)用非靜態(tài)方法
  echo self::get()."br/>"; //self調(diào)用靜態(tài)方法
  echo static::$static."br/>";//static調(diào)用靜態(tài)屬性
  echo static::show()."br/>";//static調(diào)用非靜態(tài)方法
  echo static::get()."br/>"; //static調(diào)用靜態(tài)方法
 }
}
$obj = new Demo();
$obj->test();

輸出結(jié)果:

static
Demo
this is function show with Nostatic
static
this is function show with Nostatic
Demo
static
this is function show with Nostatic
Demo

繼承的時(shí)候

在繼承時(shí),self和static在范圍解析操作符 (::) 的使用上有差別。parent也是在繼承的時(shí)候使用的。

?php
class A{
 static function getClassName(){
  return "this is class A";
 }
 static function testSelf(){
  echo self::getClassName();
 }
 static function testStatic(){
  echo static::getClassName();
 }
}
class B extends A{
 static function getClassName(){
  return "this is class B";
 }
}
B::testSelf();
echo "br/>";
B::testStatic();

輸出結(jié)果:

this is class A
this is class B

self調(diào)用的靜態(tài)方法或?qū)傩允冀K表示其在使用的時(shí)候的當(dāng)前類(A)的方法或?qū)傩?,可以替換為其類名,但是在類名很長或者有可能變化的情況下,使用self::的方式無疑是更好的選擇。

static調(diào)用的靜態(tài)方法或?qū)傩詴?huì)在繼承中被其子類重寫覆蓋,應(yīng)該替換為對(duì)應(yīng)的子類名(B)。

parent關(guān)鍵字用于調(diào)用父類的方法和屬性。在靜態(tài)方法中,可以調(diào)用父類的靜態(tài)方法和屬性;在非靜態(tài)方法中,可以調(diào)用父類的方法和屬性。

?php
class A{
 public static $static;
 public $Nostatic; 
 public function __construct(){
  self::$static = "static";
  $this->Nostatic = "Nostatic";
 }
 public static function staticFun(){
  return self::$static;
 }
 public function noStaticFun(){
  return "this is function show with ".$this->Nostatic;
 }
}
class B extends A{
 static function testS(){
  echo parent::staticFun();
 }
 function testNoS(){
  echo parent::noStaticFun();
 }
}
$obj = new B();
$obj->testS();
echo "br/>";
$obj->testNoS();

輸出結(jié)果

static
this is function show with Nostatic

在文章的最后,我們分析一個(gè)手冊(cè)上的例子

?php
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();
?>

輸出結(jié)果

A
C
C

我們單獨(dú)拿出test方法進(jìn)行分析:

public static function test() {
  A::foo();
  parent::foo();
  self::foo();
}

1)A::foo();這個(gè)語句是可以在任何地方執(zhí)行的,它表示使用A去調(diào)用靜態(tài)方法foo()得到'A'。

2)parent::foo();C的parent是B,B的parent是A,回溯找到了A的foo方法;static::who();語句中的static::調(diào)用的方法會(huì)被子類覆蓋,所以優(yōu)先調(diào)用C的who()方法,如果C的who方法不存在會(huì)調(diào)用B的who方法,如果B的who方法不存在會(huì)調(diào)用A的who方法。所以,輸出結(jié)果是'C'。[注1]

3)self::foo();這個(gè)self::是在B中使用的,所以self::等價(jià)于B::,但是B沒有實(shí)現(xiàn)foo方法,B又繼承自A,所以我們實(shí)際上調(diào)用了A::foo()這個(gè)方法。foo方法使用了static::who()語句,導(dǎo)致我們又調(diào)用了C的who函數(shù)。[注2]

注1:補(bǔ)充解釋上面的(2)

?php
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();
?>

輸出結(jié)果:

A B B

注2:補(bǔ)充解釋上面的(3)

?php
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 foo() {
  echo "fooB"."\n";
 }
 public static function who() {
  echo __CLASS__."\n";
 }
}
class C extends B {
 public static function foo() {
  echo "fooC"."\n";
 }
 public static function who() {
  echo __CLASS__."\n";
 }
}
C::test();
?>

輸出結(jié)果:

A C fooB

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP的new static和new self的區(qū)別與使用
  • php面向?qū)ο蟪绦蛟O(shè)計(jì)中self與static的區(qū)別分析
  • PHP面向?qū)ο笾衝ew self()與 new static()的區(qū)別淺析
  • 淺談PHP中new self()和new static()的區(qū)別
  • PHP Class self 與 static 異同與使用詳解

標(biāo)簽:廣元 江蘇 衢州 大理 棗莊 萍鄉(xiāng) 蚌埠 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中的self、static、parent關(guān)鍵字用法分析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    石狮市| 象州县| 济阳县| 时尚| 栾城县| 新丰县| 祁东县| 怀柔区| 渭源县| 华亭县| 莆田市| 兴隆县| 黄龙县| 汨罗市| 武夷山市| 光山县| 依兰县| 唐海县| 集贤县| 遵义市| 富蕴县| 太康县| 攀枝花市| 偏关县| 福州市| 阳高县| 德清县| 元朗区| 资源县| 会昌县| 阿拉尔市| 自治县| 鞍山市| 宜兴市| 商丘市| 靖江市| 荔浦县| 曲靖市| 定安县| 海原县| 临邑县|