2012-04-04 105 views
3

This thread並沒有幫助我的所有公共屬性(名稱和值)。顯示對象

如果我使用

$class_vars = get_class_vars(get_class($this)); 

foreach ($class_vars as $name => $value) { 
    echo "$name : $value\n"; 
} 

我得到

attrib1_name:attrib2_name:attrib3_name

有沒有價值。還顯示一個私人屬性,我不想要。

如果我使用

echo "<pre>"; 
print_r(get_object_vars($this)); 
echo "</pre>"; 

我得到

陣列 ( [atrrib1_name] => attrib1_value [attrib2_name] => attrib2_value )

在這裏,我再次有一個私人屬性和所有的子屬性。但是這次我有價值。我怎樣才能將它限制在一個層面上?

難道沒有表現出與他們的對象的值,所有的公共屬性的可能性?

+1

私人性質顯示爲你陷入下跌從私有道具可見的範圍調用get_class_vars。從文檔:'根據範圍,get_class_vars()將只返回可以從當前範圍訪問的屬性。「#: – 2012-04-04 10:13:44

回答

5

您所看到的非公開性質,因爲get_class_vars根據目前的範圍工作。由於您使用$this你的代碼是類,所以本次非公開性質從當前範圍訪問。 get_object_vars也是如此,這可能是更好的選擇。

在任何情況下,一個好的解決方案是移動檢索的屬性值出類的代碼。

如果您不希望創建一個免費的功能(爲什麼嚴重,動心了嗎?!),你可以使用包括一個匿名函數一招:

$getter = function($obj) { return get_object_vars($obj); }; 
$class_vars = $getter($this); 

See it in action

更新:既然你是在PHP 5.3.0 <,您可以使用此等效代碼:

$getter = create_function('$obj', 'return get_object_vars($obj);'); 
$class_vars = $getter($this); 
+0

我以爲我可以使用'dump()'方法,我可以把每個類作爲一個公共函數。用匿名函數的方法看起來很有趣。如果我使用你的代碼,我會在你的例子的第二行中得到'Parse error:syntax error,unexpected T_FUNCTION'。 – testing 2012-04-04 10:24:03

+1

@testing:這是因爲您正在使用PHP <5.3.0。查看我的更新。 – Jon 2012-04-04 10:25:33

+0

你說得對。我使用PHP 5.2.9。您的示例的哪部分不受PHP 5.2.9支持?有沒有另一種方法來重寫你的例子? – testing 2012-04-04 10:30:01

1
+0

php.net似乎今天幾乎不可能... – testing 2012-04-04 10:17:17

+0

谷歌」PHP反射「,並找到一些教程學習。我可以向你保證它是一條正確的道路。學習php反射後,你可以做更多。 – 2012-04-04 10:20:53

+1

@testing你可以訪問特定的國家,如http://ca.php.net/ – 2012-04-04 10:21:23

-1

我充分認識你想什麼來實現,爲什麼沒有外在的東西像這樣助陣......(從PHPFiddle粘貼)

<?php 

final class utils { 
    public static function getProperties(& $what) { 
     return get_object_vars($what); 
    } 
} 
class ball { 
    var $name; 
    private $x, $y; 

    function __construct($name,$x,$y) { 

    } 

    function publicPropsToArray() { 
     return utils::getProperties($this); 
    } 
    function allPropsToArray() { 
     return get_object_vars($this); 
    } 
} 

$ball1 = new ball('henry',5,6); 
//$ball2 = new ball('henry',3,4); 

echo "<pre>"; 
print_r($ball1->publicPropsToArray()); 
echo "\r\n\r\n"; 
print_r($ball1->allPropsToArray()); 

echo "\r\n\r\n"; 

?> 

這樣我既可以訪問該送的對象或東西的所有屬性,如數據庫訪問層或類似的功能「安全」數據T Ø視圖或其它非特權模式,我可以只發送的公共屬性,但有對象中定義的行爲。

當然這會導致與公用事業類耦合,但要公平並非所有的接頭是壞的,有些是nesecarry實現的最終目標,不要被這些東西

+0

我只是注意到,這已被低估。 WTF在每個類中寫同樣的東西並不是一個好主意,尤其是對於匿名函數,它們應該儘量少用,好的答案是有一個靜態或單例的實用程序類,在開始時引導程序(我的答案),或使用全球功能,因爲喬恩後來說...對喬恩,因爲它不會讓我評論你的代碼,如果你閱讀這個請回應我想知道你背後的匿名背後的想法特別是它對可維護性的影響 – 2014-03-25 09:36:43