1. 程式人生 > >PHP中的self、static、parent關鍵字

PHP中的self、static、parent關鍵字

看到php裡面有關於後期靜態繫結的內容,雖然沒有完全看懂,但是也收穫不少東西。

不存在繼承的時候

不存在繼承的意思就是,就書寫一個單獨的類來使用的時候。self和static在範圍解析操作符 (::) 的使用上,並無區別。

  • 在靜態函式中,self和static可以呼叫靜態屬性和靜態函式(沒有例項化類,因此不能呼叫非靜態的屬性和函式)。
  • 在非靜態函式中,self和static可以呼叫靜態屬性和靜態函式以及非靜態函式

此時,self和static的表現是一樣的,可以替換為該類名::的方式呼叫。

<?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/>"; //使用類名呼叫靜態屬性 echo Demo::get()."<br/>"; //使用類名呼叫靜態屬性 echo Demo::show()."<br/>"; //使用類名呼叫靜態屬性 echo self::$static."<br/>"; //self呼叫靜態屬性 echo self::show()."<br/>"; //self呼叫非靜態方法 echo self::get()."<br/>"
; //self呼叫靜態方法 echo static::$static."<br/>";//static呼叫靜態屬性 echo static::show()."<br/>";//static呼叫非靜態方法 echo static::get()."<br/>"; //static呼叫靜態方法 } } $obj = new Demo(); $obj->test();

輸出結果:

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

繼承的時候

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

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

輸出結果:

this is class A
this is class B

self呼叫的靜態方法或屬性始終表示其在使用的時候的當前類(A)的方法或屬性,可以替換為其類名,但是在類名很長或者有可能變化的情況下,使用self::的方式無疑是更好的選擇。
static呼叫的靜態方法或屬性會在繼承中被其子類重寫覆蓋,應該替換為對應的子類名(B)。

parent關鍵字用於呼叫父類的方法和屬性。在靜態方法中,可以呼叫父類的靜態方法和屬性;在非靜態方法中,可以呼叫父類的方法和屬性。

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

輸出結果

static
this is function show with Nostatic

在文章的最後,我們分析一個手冊上的例子

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

輸出結果

A
C
C

我們單獨拿出test方法進行分析:

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

1)A::foo();這個語句是可以在任何地方執行的,它表示使用A去呼叫靜態方法foo()得到’A’。
2)parent::foo();C的parent是B,B的parent是A,回溯找到了A的foo方法;static::who();語句中的static::呼叫的方法會被子類覆蓋,所以優先呼叫C的who()方法,如果C的who方法不存在會呼叫B的who方法,如果B的who方法不存在會呼叫A的who方法。所以,輸出結果是’C’。[注1]
3)self::foo();這個self::是在B中使用的,所以self::等價於B::,但是B沒有實現foo方法,B又繼承自A,所以我們實際上呼叫了A::foo()這個方法。foo方法使用了static::who()語句,導致我們又呼叫了C的who函式。[注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();
?> 

輸出結果:

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

輸出結果:

A C fooB

相關推薦

phpself,this, parent 詳解

pre name 重寫 重新 調用父類 set 改變 col upload 1、前言 self,this,parent 這三個關鍵字在 類的使用中可謂屢見不鮮,那麽這三個關鍵字又有什麽區別;從字面意思理解: this 是指向當前類(就近原則,離誰近跟誰) self

PHPselfstatic

php self static 所謂延遲靜態綁定,顧名思義,靜態調用時::符號左側的部分的的綁定是延遲,也就是說不再被解析為定義當前方法所在的類,而是在實際運行時計算的。 class A { public static function who() { echo __

phpselfstatic的區別

1、假設我們有個Car類,它有2個方法:model()和getModel()。 class Car{ public function model(){ //這裡我們使用了關鍵字self self::getModel(); } p

PHPselfstaticparent關鍵字

看到php裡面有關於後期靜態繫結的內容,雖然沒有完全看懂,但是也收穫不少東西。 不存在繼承的時候 不存在繼承的意思就是,就書寫一個單獨的類來使用的時候。self和static在範圍解析操作符 (::) 的使用上,並無區別。 在靜態函式中,self

PHP parentselfstatic$this 的區別 & 後期靜態繫結詳解

開發十年,就只剩下這套架構體系了! >>>   

PHP 面向對象常見關鍵字使用(finalstaticconst和instanceof)

對象的引用 符號 存在 stat true 函數 php 面向對象 his 對象引用 PHP 面向對象中常見關鍵字的使用:   1、final :final關鍵字可以加在類或者類中方法之前,但是不能使用final標識成員屬性。     作用: 使用final標識的類,不能被

PHP常見概念混淆(七)之selfstaticparent的區別

sta parent tst 執行 pub call 例子 turn function 前言 首先,這個 static 符號跟 static(靜態)關鍵字不是一個東西。這三個符號在PHP對象中共有兩種用法: 在類內部,可以使用 new self、 new static、

phpself parent的用法

self: 本類(不要理解成本物件) parent: 父類 在引入自身的靜態屬性/靜態方法,以及父類的方法時,可以用到. 用法: self::$staticProperty self::st

C/C++autostaticregisterextern關鍵字區別小結

1. 說明   以上四種都是變數儲存說明符,因為C/C++語言在變數定義時候的完整語法是:      [儲存說明符] [資料型別] [變數名稱] [=初始化];   因為大多我們宣告的變數都

C語言關鍵字autostaticregisterexternvolatilerestrict的作用

(1):auto關鍵字在C語言中只有一個作用,那就是修飾區域性變數。 (2):auto修飾區域性變數,表示這個區域性變數時自動區域性變數,自動區域性變數分配在棧上。(既然是分配在棧上,說明他如果不初始化的話那麼值就是隨機的....)  (3):平時定義區域性變數時就是定義的auto的,只是省略了auto關鍵字

嵌入式開發關鍵字conststaticvolatile的用法分析

【1】static: 1)限制變數或者函式的作用域 2)設定變數的儲存域 常見的有: (1)static全域性變數(2)static區域性變數(3)static函式 (1)static全域性變數:1、static全域性變數只初使化一次,防止在其他檔案單元中被引用;2、只在定

Java的內存處理機制和finalstaticfinal static總結

stat 入口 引用類型 堆棧 class a 如果 虛擬 不同 bsp Java中的內存處理機制和final、static、final static總結 裝載自:http://blog.csdn.net/wqthaha/article/details/209235

php學習日記2(關於php的符號->=>和::的意思)

常用 如果 count left 部分 之間 大於等於 ech repl ‘- >’符號是“插入式解引用操作符”(infix dereference operator)。換句話說,它是調用由引用傳遞參數的子程序的方法(當然,還有其它的作用)。正如我們上面所提到的,在調

封裝構造方法privateStatic與this關鍵字main()_Day07

形參 調用構造 查找 logs code 屬性 too person 步驟 1:成員變量和局部變量的區別(理解)    (1)定義位置區別:      成員變量:定義在類中,方法外。      局部變量:定義在方法中,或者方法聲明上。   

php簽名公鑰私鑰詳解

public spa php pan signature == 業務邏輯 pubkey \n 由於http請求是無狀態,所以我們不知道請求方到底是誰。於是就誕生了簽名,接收方和請求方協商一種簽名方式進行驗證,來取得互相信任,進行下一步業務邏輯交流。 其中簽名用得很多的就是公

java的關鍵字 thissuperfinalstatic

使用 實參 原來 創建過程 列表 clas 必須 attribute ceshi 1、this關鍵字(1)成員變量和局部變量同名 可以在成員變量名前面加上this.來區別成員變量和局部變量 package com.oracle.demo03; public class

Javathisstaticsuperfinal

this class Person { public String _name; public int _age; public Person() //無參構造 { System.out.println("Person()");

4.Java_關鍵字thissuperstaticfinal(終結器)與基本資料型別轉換

一、關鍵字this 1.表示呼叫本類屬性:在類中訪問類的屬性,一定要加上this關鍵字。 2.表示呼叫本類方法:         (1)呼叫普通方法:this.方法名(引數);   當有類的繼承關係時,表示本類方法一定要加上th

Java的thispublicstaticprotected關鍵字——有C++基礎的Java入門(四)

目錄 一、 this關鍵字 1、 概念 2、 例項 3、 常見用法 4、 原理  二、 public關鍵字 三、static關鍵字 1、修飾在屬性上 2、修飾在方法上 四、 protected關鍵字 一、 this關鍵字 我覺得thi

PHP怎麼用echoprintprint_rvar_dumpprintfsprintf 和 vsprintf ?

PHP中怎麼用echo、print、print_r、var_dump、printf、sprintf 和 vsprintf ? echo:echo 是一個語言結構,可以輸出標量型別的資料,如int、float、- - string。沒有返回值。 print: print 是一