簡體   English   中英

日常生活中__get的適當用例

[英]Appropriate use case of __get in daily life programming

我正在學習OOP和PHP。 下面是我實現__get方法的方式。 它工作正常,但我不明白為什么要使用它。 因為在我的示例中,我故意將屬性設置為protected,所以無法通過外部類訪問。 那么__get then的目的是什么?

class Magic {
    protected $name = 'John';
    public $age = 26;
    public $new_name;

    public function __get($key){
        $this->new_name = $key;
    }

    public function get_new_name(){
        return $this->new_name. " is my friend";
    }
}

$person = new Magic();
$person->Alan;
echo $person->get_new_name();

例如,您可以使用__get方法獲取數組的值。 在這種情況下,您可以具有動態數量的類變量。

public function __get($key){
    return $this->property[$key];
}

沒有合理的理由讓我想到您可以將__get()與受保護的字符串一起使用,受保護的數組將很有用,但對字符串沒有幫助。 您提供的示例有效,但它並不是讓其他人理解或與IDE(代碼編輯器)一起使用的最佳代碼。

由於您似乎不明白我在說什么,因此這里有一個快速數據庫腳本的示例。

假設您要使用類似ORM的類在數據庫中插入一行。 您將執行以下操作:

Class Person {
  protected $fields = array();
  public function setField($name, $value) {
    $this->fields[$name] = $value;
  }
  public function getField($name) {
    return $this->fields[$name];
  }
  public function save() {
    Database::insert($table, $fields);  // Generic function to insert the row, don't worry about this.
  }
}

現在,在這種情況下,您可以執行以下操作:

$person = new Person();
$person->setField('name', 'Bob');
$person->setField('age', '30');
$person->save();

echo $person->getField('name'); // Echoes Bob

超載

現在要更改此設置,我們可以使用__set()而不是setField()__get()而不是getField() __get()

Class Person {
  protected $fields = array();
  public function __set($name, $value) {
    $this->fields[$name] = $value;
  }
  public function __get($name) {
   return $this->fields[$name];
  }
  public function save() {
    Database::insert($table, $fields);
  }
}

現在,在這種情況下,您可以執行以下操作:

$person = new Person();
$person->name =  'Bob';
$person->age = '30';
$person->save();

echo $person->name; // Echoes Bob

希望這為您提供了一個有關過載如何工作的簡單示例。 我們不想聲明屬性$name$age因為我們想使用這些屬性來構建$fields數組,該數組隨后將在插入中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM