您需要使用get_class_vars()
,它返回所提供的類的所有屬性(類瓦爾)的關聯數組,使用var名稱作爲關鍵。使用類內部的get_class_vars(get_called_class())
將該類的名稱作爲字符串獲取。 get_class($this)
也適用。
當然,這會給你全部該類的屬性(不管訪問控制修飾符),所以你也可以過濾這個列表。一個簡單的(如果有點混淆)的方式是使用array_intersect_key()
以及array_flip()
根據this SE Answer。所以整個事情看起來像:
array_intersect_key(get_class_vars(get_called_class()), array_flip(array('var_1', 'var_2', 'var_3')));
您將不得不決定是否真的值得它。可能更容易閱讀array('var_1' => $this->var_1, 'var_2' => $this->var_2);
,因爲@ircmaxell指出。
但是,因爲a)我喜歡Yak Shaving和b)因爲我非常勤奮lazy programmer和c)在Perl中可能有一行代碼優雅地做了這個,這裏是代碼在我遇到的問題的上下文中試圖解決:用相同類的數量(但不是全部)其他屬性重寫一個關聯數組(也是當前類的一個屬性)。
<?php
class Test {
protected $var_1 = 'foo';
private $var_2 = 'bar';
public $var_3 = 'baz';
private $ignored_var = 'meh';
public $ary = array(
'var_1' => 'bletch',
'var_2' => 'belch',
'var_4' => 'gumbo',
'var_5' => 'thumbo'
);
public function test(){
$override = array_intersect_key(get_class_vars(get_called_class()), array_flip(array('var_1', 'var_2', 'var_3')));
return array_merge($this->ary, $override);
}
}
$test = new Test();
var_dump($test->test());
將會產生預期的輸出:
array(5) { ["var_1"]=> string(3) "foo" ["var_2"]=> string(3) "bar" ["var_4"]=> string(5) "gumbo" ["var_5"]=> string(6) "thumbo" ["var_3"]=> string(3) "baz" }
注意,在我自己的使用,我不會打破這一點,到2線,但我想保持一個引用代碼OP分開。
我對這個函數或「提取」不是很瞭解,但是我可以告訴你在那裏末尾沒有括號。可能只是一個轉位問題,但也許這是你的問題? 在其他消息中,我會冒險猜測$這不是對象符號表的一部分,因此不能正確打包。 – rockerest 2011-02-14 16:49:08
不需要`array()`,你必須指定'this',而不是$ this。 – greg0ire 2011-02-14 16:53:20
@ greg0rie,這是你的作品嗎?你使用哪個PHP版本? – Buddy 2011-02-17 17:07:07