2015-07-19 73 views
3

來自Java背景,我覺得這很奇怪。請看看這段代碼 -爲什麼PHP允許從類外部創建類屬性?

<?php 
    class People { 
     private $name; 
     private $age; 
     public function set_info($name, $age) { 
      $this->name = $name; 
      $this->age = $age; 
     } 

     public function get_info() { 
      echo "Name : {$this->name}<br />"; 
      echo "Age : {$this->age}<br />"; 
     } 
    } 

    $p1 = new People(); 
    $p1->set_info("Sam",22); 
    $p1->get_info(); 

    $p1->ID = 12057; 

    echo "<pre>".print_r($p1,true)."</pre>"; 
?> 

OUTPUT:

People Object 
(
    [name:People:private] => Sam 
    [age:People:private] => 22 
    [ID] => 12057 
) 

已經不在People類的任何財產作爲ID,但我可以在類外使用的值賦給IDp1

在Java中,這會給出一個錯誤 -

找不到符號

這是PHP中的功能?如果是,那麼它叫什麼?它有什麼好處?

+0

是的,這是PHP對象的一個​​特性。我認爲你不應該依賴它。我認爲它是與PHP4的對象模型(看起來像數組與方法)逆向兼容。我找不到任何關於此的官方文檔。 – Mat

+0

以下是一種避免它的方法:http://stackoverflow.com/q/9136464/472495 – halfer

+0

可能的重複http://stackoverflow.com/questions/25132970/undefined-public-member-variables-getting-initialized – Gogol

回答

5

由於PHP是一種動態類型的腳本語言,它允許Dynamic Properties。我向你推薦這個this article

語言如JavaScript和Python允許對象實例具有 動態特性。事實證明,PHP也是如此。看看 關於對象和類的官方PHP文檔,您可能會導致 認爲動態實例屬性需要定製__get和__set 魔術方法。他們不。

相關問題