1. 程式人生 > >PHP中new static()與new self()的區別異同分析

PHP中new static()與new self()的區別異同分析

本文例項講述了PHP中new static()與new self()的區別異同,相信對於大家學習PHP程式設計能夠帶來一定的幫助。

問題的起因是本地搭建一個站。發現用PHP 5.2 搭建不起來,站PHP程式碼裡面有很多5.3以上的部分,要求更改在5.2下能執行。

改著改著發現了一個地方

return new static($val);

這尼瑪是神馬,只見過

return new self($val);
 
class A {
  public static function get_self() {
    return new self();
  }
 
  public static function get_static() {
    return new static();
  }
}
 
class B extends A {}
 
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A

於是上網查了下,他們兩個的區別。

self - 就是這個類,是程式碼段裡面的這個類。

static - PHP 5.3加進來的只得是當前這個類,有點像$this的意思,從堆記憶體中提取出來,訪問的是當前例項化的那個類,那麼 static 代表的就是那個類。

還是看看老外的專業解釋吧:

self refers to the same class whose method the new operation takes place in.

static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.

In the following example, B inherits both methods from A. self is bound to A because it's defined in A's implementation of the first method, whereas static is bound to the called class (also see  get_called_class() ).

class A {
  public static function get_self() {
    return new self();
  }
 
  
public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_static()); // A

這個例子基本上一看就懂了吧。

class A {
  public function create1() {
    $class = get_class($this);
    return new $class();
  }
  public function create2() {
    return new static();
  }
}
 
class B extends A {
 
}
 
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
 
/*
The result
string(1) "B"
string(1) "B"
*/
 

原理了解了,但是問題還沒有解決,如何解決掉 return new static($val); 這個問題呢?

其實也簡單就是用 get_class($this); 程式碼如下:

---

相關推薦

PHPnew static()new self()的區別異同分析

本文例項講述了PHP中new static()與new self()的區別異同,相信對於大家學習PHP程式設計能夠帶來一定的幫助。 問題的起因是本地搭建一個站。發現用PHP 5.2 搭建不起來,站PHP程式碼裡面有很多5.3以上的部分,要求更改在5.2下能執行。 改著改著發現了一個地方 return

對比 PHP new static() new self()

arr sta 創建 function turn dump self 區別 stat 通過new static()與new self()都能產生實例對象,new static()是在PHP5.3版本中引入的新特性,本文對二者稍作對比。 一、當直接通過本類創建實例時

PHP抽象類介面的區別

PHP中抽象類與介面的區別 抽象類abstract 概念 定義為抽象的類不能被例項化。任何一個類,如果有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的類。 繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須喝父類中一樣或者更為寬鬆。 例如,某個抽象方法被宣告為pro

PHPnew static() 和 new self() 的區別

pub 堆內存 func sel urn ret 通過 ati php self 指的是self所在的類 new static 實例化的是當前使用的類,有點像$this ,從堆內存中提取出來。 還是通過實例說明一下: class A { public static f

C++宣告物件new物件的區別

new出來的物件是直接放在堆上,而宣告一個物件是放在棧中。換句話說,new出來的物件的生命週期是全域性的,譬如在一個函式塊裡new一個物件,可以將該物件的指標返回回去,該物件依舊存在。而宣告的物件的生命週期只存在於聲明瞭該物件的函式塊中,如果返回該宣告的物件,將會返回一個已經

new staticnew self區別

 new static    new self   都是例項化當前類, 但是new static只有程式碼所在的類,就是子類如果沒有重寫的話那麼例項化的就是父類。 而ne

new staticnew self 區別

<?php /** * Created by PhpStorm. * User: 27394 * Date: 2016/11/15 * Time: 8:35 */ class A{

C#override重寫new隱藏的區別,以及C#Java的Override區別

在C#中:override重寫,是指對父類中的虛方法(標記為override)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致new方法隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個

檢測某個方法是否屬於某個類--解析php函數method_exists()is_callable()的區別

檢查 -1 元素 高級 ech 9.png true strong 原創 php函數method_exists() 與is_callable()的區別在哪?在php面相對象設計過程中,往往我們需要在調用某一個方法是否屬於某一個類的時候做出判斷,常用的方法有 meth

PHP的 extendsimplements 區別

extends 是繼承某個類 ,繼承之後可以使用父類的方法 ,也可以重寫父類的方法。 implements 是實現多個介面,介面的方法一般為空的,必須重寫才能使用. extends是繼承父類,只要那個類不是宣告為final或者那個類定義為abstract的就能繼承,php中不支援多重繼承,但

php傳值傳引用的有什麼區別

php傳值:在函式範圍內,改變變數值得大小,都不不會影響到函式外邊的變數值。 PHP按引用:在函式範圍內,對值的任何改變,在函式外部也有所體現,因為傳引用傳的是記憶體地址。 <?php //傳值 $a = 1; $b = 2; $b = $a; $a = 3; echo $b.

【宇潤日常瘋測-005】PHP 的 clone 和 new 效能比較

clone和new本不應該放在一起比較,它們的作用是不同的。但可能有一些場景下,可以用clone也可以用new,那麼這時候我們選哪個呢? 我編寫了兩個測試,第一個是宣告一個空類,第二個是帶構造方法、屬性的類。另外,我還加入了 PHP 序列化的測試。 國際慣例,直接上程式碼,一目瞭然。 程式碼 <?php

javascriptObject.createnew的不同

new new配合建構函式使用,建立一個新物件。 //定義class var Person = function (firstName) {   this.firstName = firstName; }; //定義method Person.prototype.sayH

PHP抽象類接口的區別

there array 可選 star function 報錯 int bad 中一 PHP中抽象類與接口的區別 抽象類abstract 概念 定義為抽象的類不能被實例化。任何一個類,如果有一個方法是被聲明為抽象的,那麽這個類就必須被聲明為抽象的類。 繼承一個抽象類的時候,

php 靜態繫結static::修飾符private,public,protected之間的關係

對於靜態繫結中的static::在此不多做解釋,我想用例項來證明,這個例子是來自官方文件: For example one: class A{ private function

ios開發類方法例項方法區別 以及self有什麼不同

Objective-C裡面既有例項方法也類方法。類方法(Class Method) 有時被稱為工廠方法(Factory Method)或者方便方法(Convenience method)。工廠方法的稱謂明顯和一般意義上的工廠方法不同,從本質上來說,類方法可以獨立於物件而執行,所以在其他的語言裡面類方法有的

PHPinclude和require語句的區別

warning mar 處理 生成 區別 war 插入 php 通過 通過 include 或 require 語句,可以將 PHP 文件的內容插入另一個 PHP 文件(在服務器執行它之前)。 include 和 require 語句是相同的,除了錯誤處理方面:

13-1 在PHP使用mysqliMySQL交互

style value free error tor file mysql服務器 del 提示 1.建立、關閉與MySQL服務器的連接 1)連接指定的mysql服務器 [email protected]/* */_connect($host,

PHP的mb_convert_encodingiconv函數介紹

mbstring version zend gb2 bst intern mixed 介紹 int php傳輸亂碼 mb_convert_encoding這個函數是用來轉換編碼的。原來一直對程序編碼這一概念不理解,不過現在好像有點開竅了。 不過英文一般不會存在編碼問題,

jqueryinnerheight outerHeight()height()的區別

() true class lan 方法 target alt title include 1. .height() 獲取匹配元素集合中的第一個元素的當前計算高度值 或 設置每一個匹配元素的高度值(帶一個參數)。 註意:1).css(‘height‘)和.height