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
相關推薦
php中self,this, parent 詳解
pre name 重寫 重新 調用父類 set 改變 col upload 1、前言 self,this,parent 這三個關鍵字在 類的使用中可謂屢見不鮮,那麽這三個關鍵字又有什麽區別;從字面意思理解: this 是指向當前類(就近原則,離誰近跟誰) self
PHP中self與static
php self static 所謂延遲靜態綁定,顧名思義,靜態調用時::符號左側的部分的的綁定是延遲,也就是說不再被解析為定義當前方法所在的類,而是在實際運行時計算的。 class A { public static function who() { echo __
php中self與static的區別
1、假設我們有個Car類,它有2個方法:model()和getModel()。 class Car{ public function model(){ //這裡我們使用了關鍵字self self::getModel(); } p
PHP中的self、static、parent關鍵字
看到php裡面有關於後期靜態繫結的內容,雖然沒有完全看懂,但是也收穫不少東西。 不存在繼承的時候 不存在繼承的意思就是,就書寫一個單獨的類來使用的時候。self和static在範圍解析操作符 (::) 的使用上,並無區別。 在靜態函式中,self
PHP 中 parent、self、static、$this 的區別 & 後期靜態繫結詳解
開發十年,就只剩下這套架構體系了! >>>
PHP 面向對象中常見關鍵字使用(final、static、const和instanceof)
對象的引用 符號 存在 stat true 函數 php 面向對象 his 對象引用 PHP 面向對象中常見關鍵字的使用: 1、final :final關鍵字可以加在類或者類中方法之前,但是不能使用final標識成員屬性。 作用: 使用final標識的類,不能被
PHP常見概念混淆(七)之self、static、parent的區別
sta parent tst 執行 pub call 例子 turn function 前言 首先,這個 static 符號跟 static(靜態)關鍵字不是一個東西。這三個符號在PHP對象中共有兩種用法: 在類內部,可以使用 new self、 new static、
php中self 、parent的用法
self: 本類(不要理解成本物件) parent: 父類 在引入自身的靜態屬性/靜態方法,以及父類的方法時,可以用到. 用法: self::$staticProperty self::st
C/C++中auto、static、register、extern關鍵字區別小結
1. 說明 以上四種都是變數儲存說明符,因為C/C++語言在變數定義時候的完整語法是: [儲存說明符] [資料型別] [變數名稱] [=初始化]; 因為大多我們宣告的變數都
C語言中關鍵字auto、static、register、extern、volatile、restrict的作用
(1):auto關鍵字在C語言中只有一個作用,那就是修飾區域性變數。 (2):auto修飾區域性變數,表示這個區域性變數時自動區域性變數,自動區域性變數分配在棧上。(既然是分配在棧上,說明他如果不初始化的話那麼值就是隨機的....) (3):平時定義區域性變數時就是定義的auto的,只是省略了auto關鍵字
嵌入式開發中關鍵字const、static、volatile的用法分析
【1】static: 1)限制變數或者函式的作用域 2)設定變數的儲存域 常見的有: (1)static全域性變數(2)static區域性變數(3)static函式 (1)static全域性變數:1、static全域性變數只初使化一次,防止在其他檔案單元中被引用;2、只在定
Java中的內存處理機制和final、static、final 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)。換句話說,它是調用由引用傳遞參數的子程序的方法(當然,還有其它的作用)。正如我們上面所提到的,在調
封裝、構造方法、private、Static與this關鍵字、main()_Day07
形參 調用構造 查找 logs code 屬性 too person 步驟 1:成員變量和局部變量的區別(理解) (1)定義位置區別: 成員變量:定義在類中,方法外。 局部變量:定義在方法中,或者方法聲明上。
php中簽名公鑰、私鑰詳解
public spa php pan signature == 業務邏輯 pubkey \n 由於http請求是無狀態,所以我們不知道請求方到底是誰。於是就誕生了簽名,接收方和請求方協商一種簽名方式進行驗證,來取得互相信任,進行下一步業務邏輯交流。 其中簽名用得很多的就是公
java的關鍵字 this、super、final、static、
使用 實參 原來 創建過程 列表 clas 必須 attribute ceshi 1、this關鍵字(1)成員變量和局部變量同名 可以在成員變量名前面加上this.來區別成員變量和局部變量 package com.oracle.demo03; public class
Java中this、static、super、final
this class Person { public String _name; public int _age; public Person() //無參構造 { System.out.println("Person()");
4.Java_關鍵字this、super、static、final(終結器)與基本資料型別轉換
一、關鍵字this 1.表示呼叫本類屬性:在類中訪問類的屬性,一定要加上this關鍵字。 2.表示呼叫本類方法: (1)呼叫普通方法:this.方法名(引數); 當有類的繼承關係時,表示本類方法一定要加上th
Java的this、public、static、protected關鍵字——有C++基礎的Java入門(四)
目錄 一、 this關鍵字 1、 概念 2、 例項 3、 常見用法 4、 原理 二、 public關鍵字 三、static關鍵字 1、修飾在屬性上 2、修飾在方法上 四、 protected關鍵字 一、 this關鍵字 我覺得thi
PHP中怎麼用echo、print、print_r、var_dump、printf、sprintf 和 vsprintf ?
PHP中怎麼用echo、print、print_r、var_dump、printf、sprintf 和 vsprintf ? echo:echo 是一個語言結構,可以輸出標量型別的資料,如int、float、- - string。沒有返回值。 print: print 是一