引言
我們已經習慣在框架裡編寫類庫介面,使用面向物件的方式構建規模以上的應用程式。但是還有很多機會,時時刻刻與PHP陣列打交道。
PHP版本迭代並加入的物件操作特性非常豐富。今天我們來說一說最基礎的PHP空物件,怎麼使用,以及注意事項。
如果是陣列,我們可能這樣儲存資料:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
那麼有沒有辦法像下面這樣操作資料呢?
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
當然了,這個是虛擬碼。PHP中自帶了 stdClass 物件,宣告空物件使用下面的方法:
$x = new stdClass();
stdClass是預設的PHP物件。stdClass沒有屬性,方法或父級。它不支援魔術方法,並且不實現任何介面。
當將標量或陣列轉換為Object時,將獲得stdClass的例項。只要需要通用物件例項,就可以使用stdClass。
建立 stdClass 的示例,可以使用下面的任意方式:
$x = new stdClass;
$y = (object) null; // 同上
$z = (object) "a"; // 建立屬性 "scalar" = "a"
$a = (object) array("property1" => 1, "property2" => "b");
你需要格外注意:
stdClass不是基類! PHP類不會自動從任何類繼承。 所有類都是獨立的,除非它們顯式擴充套件了另一個類。 在這方面,PHP與許多面向物件的語言不同。
你無法在程式碼中定義名為“ stdClass”的類。 該名稱已被系統使用。 你可以定義一個名為“Object”的類。也可以定義一個擴充套件stdClass的類,但不會獲得任何好處,因為stdClass不執行任何操作。
再舉一個例子:
class CTest { public $property1; } $t = new CTest; var_dump($t instanceof stdClass); // false var_dump(is_subclass_of($t, "stdClass")); // false echo get_class($t) . "\n"; // "CTest" echo get_parent_class($t) . "\n"; // false (no parent)
注意,PHP的類是獨立存在的,上面的 CTest 類也絕不是繼承自 stdClass 物件。
透過本文,你應該收穫一個重要的概念,那就是,PHP 的類除非手動嚴格指定繼承類,否則都是獨立存在的。
同時,PHP 提供了標準的 stdClass 物件用於構建空物件。操作資料時可以不用像陣列那樣了。但是,拋開陣列,你講很大程式上享受不到PHP帶來的資料操作便利。
Happy coding :_)
引言
我們已經習慣在框架裡編寫類庫介面,使用面向物件的方式構建規模以上的應用程式。但是還有很多機會,時時刻刻與PHP陣列打交道。
PHP版本迭代並加入的物件操作特性非常豐富。今天我們來說一說最基礎的PHP空物件,怎麼使用,以及注意事項。
學習時間如果是陣列,我們可能這樣儲存資料:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
那麼有沒有辦法像下面這樣操作資料呢?
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
當然了,這個是虛擬碼。PHP中自帶了 stdClass 物件,宣告空物件使用下面的方法:
$x = new stdClass();
stdClass是預設的PHP物件。stdClass沒有屬性,方法或父級。它不支援魔術方法,並且不實現任何介面。
當將標量或陣列轉換為Object時,將獲得stdClass的例項。只要需要通用物件例項,就可以使用stdClass。
建立 stdClass 的示例,可以使用下面的任意方式:
$x = new stdClass;
$y = (object) null; // 同上
$z = (object) "a"; // 建立屬性 "scalar" = "a"
$a = (object) array("property1" => 1, "property2" => "b");
你需要格外注意:
stdClass不是基類! PHP類不會自動從任何類繼承。 所有類都是獨立的,除非它們顯式擴充套件了另一個類。 在這方面,PHP與許多面向物件的語言不同。
你無法在程式碼中定義名為“ stdClass”的類。 該名稱已被系統使用。 你可以定義一個名為“Object”的類。也可以定義一個擴充套件stdClass的類,但不會獲得任何好處,因為stdClass不執行任何操作。
再舉一個例子:
class CTest { public $property1; } $t = new CTest; var_dump($t instanceof stdClass); // false var_dump(is_subclass_of($t, "stdClass")); // false echo get_class($t) . "\n"; // "CTest" echo get_parent_class($t) . "\n"; // false (no parent)
注意,PHP的類是獨立存在的,上面的 CTest 類也絕不是繼承自 stdClass 物件。
寫在最後透過本文,你應該收穫一個重要的概念,那就是,PHP 的類除非手動嚴格指定繼承類,否則都是獨立存在的。
同時,PHP 提供了標準的 stdClass 物件用於構建空物件。操作資料時可以不用像陣列那樣了。但是,拋開陣列,你講很大程式上享受不到PHP帶來的資料操作便利。
Happy coding :_)