Phi*_*ord 3 php arrays getter-setter
所以我有几个阵列
$array_1 = Array('one','two','three');
$array_2 = Array('red','blue','green');
Run Code Online (Sandbox Code Playgroud)
是否有动态方法为具有单值条目的数组创建Setters和Getters?
所以课程类似于:
class xFromArray() {
}
Run Code Online (Sandbox Code Playgroud)
所以如果我传递$ array_1,它会产生如下所示:
private $one;
setOne($x) {
$one = $x;
}
getOne() {
return $one;
}
Run Code Online (Sandbox Code Playgroud)
如果我传递$ array_2,它会生成如下内容:
private $red;
setRed($x) {
$red = $x;
}
getRed() {
return $red;
}
Run Code Online (Sandbox Code Playgroud)
所以我会这样称呼它?(我最好的猜测,但似乎不会这样)
$xFromArray = new xFromArray;
foreach($array_1 as $key=>$data) {
$xFromArray->create_function(set.ucfirst($data)($data));
echo $xFromArray->create_function(get.ucfirst($data));
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它__call()来调用动态方法.所以:
class Wrapper {
private $properties;
public function __construct(array $names) {
$this->properties = array_combine(array_keys($names),
array_fill(0, count($names), null));
}
public function __call($name, $args) {
if (preg_match('!(get|set)(\w+)!', $name, $match)) {
$prop = lcfirst($match[2]);
if ($match[1] == 'get') {
if (count($args) != 0) {
throw new Exception("Method '$name' expected 0 arguments, got " . count($args));
}
return $properties[$prop];
} else {
if (count($args) != 1) {
throw new Exception("Method '$name' expected 1 argument, got " . count($args));
}
$properties[$prop] = $args[0];
}
} else {
throw new Exception("Unknown method $name");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我个人不会在PHP中使用getter和setter.使用特殊方法__get(),__set()而是将这些动态属性视为对象属性,而不是添加(很可能是不必要的)方法包装器.
编辑:澄清,__call()当您调用不存在或不可访问的对象中的方法时调用.所以:
$wrapper = new Wrapper($array_1);
$wrapper->setOne("foo");
echo $wrapper->getOne(); // foo
$wrapper->getAbc(); // exception, property doesn't exist
Run Code Online (Sandbox Code Playgroud)
__call()用于解密方法名称.如果它符合get或set的模式,后跟属性名称(来自初始数组),则它按预期工作,否则抛出异常.您当然可以以任何方式更改此行为.
有关这些"神奇"方法的更详细说明,请参阅PHP手册中的重载.
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |