2011-08-30 63 views
0

例如,我有一個這樣的對象:如何編寫一個數組在php中完成所有setter事情?

class myObj{ 
private $a; 
private $b; 

//getter , setter 

} 

而且我想這樣做:

$myObj = initWitharray(array('a'=> 'myavalue', 
          'b'=> 'mybvalue')); 

而且MyObj中會有所有的值和b值。我該怎麼做?謝謝。

+1

既然你需要訪問myObj的私有變量,這個init方法應該是類的成員。 – NullUserException

+0

如果你想像數組一樣使用你的對象,爲什麼不考慮使用PHP內建的Iterator接口? http://www.php.net/manual/en/class.iterator.php –

回答

1

由於NullUserException建議:

<?php 

class myObj { 

    private $a; 
    private $b; 

    public function initWithArray(array $arr) { 
     foreach ($arr as $k => $v) { 
      $this->$k = $v; 
     } 
     return $this; 
    } 

    public function get($name) { 
     return $this->$name; 
    } 

} 

// usage 
$myObj = new myObj(); 
echo $myObj->initWithArray(array(
      'a' => 'myavalue', 
      'b' => 'mybvalue')) 
     ->get('a'); 
0
function initWithArray(array $a){ 
$myObj = new myObj(); 

    foreach($a as $k => $v){ 
    $myObj->$k = $v; 
} 

return $myObj; 
} 

class myObj { 
private $a; 
private $b; 

public function __set($name, $value) { 
    $this->$name = $value; 
} 

public function __get($name){ 
    if($this->$name != null) 
    return $this->$name; 

    return null; 
} 
} 

或者,如評論所述,如果初始化函數是類的成員,則會更好。

+0

我不認爲這是可行的,因爲'$ a'和'$ b'是私人的。 – NullUserException

+0

啊,所以沒有注意到。讓我解決它... – usoban

+0

值得注意的是'__get()'中'$ name'不能爲null(或者爲空)。它總是*一個字符串。 – adlawson

0

嘗試以下操作:

class myObj { 
    private $a; 
    private $b; 

    function __construct($passedArray){ 
     $this->a = array_key_exists('a', $passedArray) ? $passedArray['a'] : 'default_value_for_a'; 
     $this->b = array_key_exists('b', $passedArray) ? $passedArray['b'] : 'default_value_for_b'; 
    } 
//Rest of the code 
} 

然後:

newObj = new myObj(array('a'=> 'myavalue', 'b'=> 'mybvalue')) 
0

你可以使用類的構造函數中的選項傳遞,當你創建一個新的對象。這樣做,你也應該分開setOptions方法,以便你可以在init之後更新選項。

使用這個類是這樣的:(同時顯示方式設置選項)

$object = new myClass(array('a'=>'foo')); 
$object->setOptions(array('b'=>'bar')); 

另外,儘量不要混淆對象類。一個對象是一個類的實例

class myClass 
{ 
    private $a; 
    private $b; 

    public function __construct(array $options = null) 
    { 
     if (null !== $options) { 
      $this->setOptions($options); 
     } 
    } 

    public function setOptions(array $options) 
    { 
     foreach ($options as $key => $value) { 
      if (isset($this->$key)) { 
       $this->$key = $value; 
      } 
     } 

     return $this; 
    } 
} 
+0

我可以調用這個... $ this-> set_ $ key = $ value;因爲,我實現了自己的制定者。 – DNB5brims

+0

您可以根據需要在其中添加其他許多方法。如果你定義了一個'set_a()'方法,你絕對可以調用'$ this-> set_a($ value)' – adlawson

0

我通常採用這給了我完全控制的對象,如允許某人訪問屬性的方法。否認許可,只允許根據應用程序訪問那些我認爲適當的許可,這就是對象的目的。

看看下面的例子。

class MyObj { 

    private $data = array('one' => null, 'two' => null); 

    public function __set($property, $value) { 
     //Only allow to set those properties which is declared in $this->data array 
     if(array_key_exists($property, $this->data)) { 
      return $this->data[$property] = $value; 
     } else { 
      //if you want to throw some error. 
     } 
    } 

    //you can allow or disallow anyone from accessing the class property directly. 
    public function __get($property) { 
     //To deny the access permission, simply throw an error and return false. 
     $error = 'access denied to class property {' . $property . '}'; 
     return false; 
     //Or Else Allow permission to access class property 
     //return $this->data[$property]; 
    } 
} 

上面的例子中你如何可以通過聲明類屬性$data私有你基本上是不容許任何人做的任何形式的操縱獲得對類屬性的更多控制,演示類屬性直接。無論什麼操作都要通過PHP的getter __get()和setter __set()方法完成。當然你可以根據你的需要修改上面的代碼,你只需要新增一行更改,它會按照你想要的方式運行。

相關問題