例如,我有一个这样的对象:
class myObj{
private $a;
private $b;
//getter , setter
}
我想做的事情如下:
$myObj = initWitharray(array('a'=> 'myavalue',
'b'=> 'mybvalue'));
myObj将拥有所有值和b值。我怎么能这样做?谢谢。
答案 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()
方法完成的。当然你可以根据你的需要修改上面的代码,你只需要进行一些改动,它就会按照你想要的方式运行。