如何写一个数组来做php中的所有setter事情?

时间:2011-08-30 07:14:54

标签: php oop

例如,我有一个这样的对象:

class myObj{
 private $a;
 private $b;

 //getter , setter

}

我想做的事情如下:

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

myObj将拥有所有值和b值。我怎么能这样做?谢谢。

5 个答案:

答案 0 :(得分: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');

答案 1 :(得分: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;
 }
}

或者,如评论中所述,如果init函数是一个类的成员,那就更好了。

答案 2 :(得分: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'))

答案 3 :(得分: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;
    }
}

答案 4 :(得分: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()方法完成的。当然你可以根据你的需要修改上面的代码,你只需要进行一些改动,它就会按照你想要的方式运行。