2012-01-19 42 views
2

取這個類中的示例:我可以創建一個不能在運行時動態添加屬性的PHP類嗎?

<?php 

class Person 
{ 
    private $name = null; 
    private $dob = null; 

    public function __construct($name, $dob) 
    { 
     $this->name = $name; 
     $this->dob = $dob; 
    } 
} 

$potts = new Person('Matt', '01/01/1987'); 
var_dump($potts); 

$potts->job = 'Software Developer'; // new dynamic property 
var_dump($potts); 

var_dump(get_object_vars($potts)); 

輸出如下:

object(Person)#1 (2) { 
    ["name":"Person":private]=> 
    string(4) "Matt" 
    ["dob":"Person":private]=> 
    string(10) "01/01/1987" 
} 

object(Person)#1 (3) { 
    ["name":"Person":private]=> 
    string(4) "Matt" 
    ["dob":"Person":private]=> 
    string(10) "01/01/1987" 
    ["job"]=> 
    string(18) "Software Developer" 
} 

array(1) { 
    ["job"]=> 
    string(18) "Software Developer" 
} 

是否可以停止添加動態特性?是否有可能獲得類定義的屬性列表? (即不是動態的,運行時添加的屬性)

+0

是的,你可以使用__get方法,如本頁其他地方所示,但我想知道爲什麼你需要這個。如果您的代碼添加了您不想要的屬性,請修復代碼。如果開發人員添加您不想要的屬性,請告訴他/她。在語言層面解決這個問題聽起來像對我來說是錯誤的。 – Gordon

回答

5

嘗試此

public function __set($name, $value){ 
throw new Exception('Not allowed'); 
} 
+0

-1因爲神奇的方法只能公開(PHP警告:神奇的方法__set()必須具有公開的可見性) – capi

+0

我不確定這一點,所以這就是爲什麼我也添加了第二個解決方案。 –

+0

謝謝 - 太棒了! – Matthew

1

可以定義一個魔法設定部,其從被定義停止屬性:

<?php 

class Person 
{ 
    private $name = null; 
    private $dob = null; 

    public function __set($name, $value) { 
     //nothing here if you want nothing to happen 
     //when a non-defined property is being set 
     //otherwise, some error throwing 
    } 

    public function __construct($name, $dob) 
    { 
     $this->name = $name; 
     $this->dob = $dob; 
    } 
} 

對於從對象觀看屬性或類,你可以嘗試:

http://www.php.net/manual/en/function.get-class-vars.php

http://www.php.net/manual/en/function.get-object-vars.php

希望它有幫助!

相關問題