例如,我有一个存储在变量中的类属性名称。
$name='id';
然后我想在没有在代码中写入函数名的情况下这样做。
$someObject->setId(123);
如何使用PHP来做到这一点?
答案 0 :(得分:2)
虽然你的骆驼写作值得关注,但这是可能的。
$name = 'id'; // id
$name = ucfirst($name); // Id
$name = 'set' . $name; // setId
$someObject->$name(123); // $someObject->setId(123);
答案 1 :(得分:2)
只需实施__set
方法:
public class a{
private $id;
public function __set($name, $val){
$this->$name = $val; //note the "$" before name.
}
}
用法:
$b = new a();
$b->id = 5;
(将在内部翻译为:__set("id", 5)
但是tbh:如果您在通用样式中实现所有setter
- 为什么不简单地将属性设为$id
public
?
答案 2 :(得分:0)
您应该查看PHP Magic Methods,它们有许多强大的自动化方法,您可以在类中实现这些方法。
答案 3 :(得分:0)
试试这段代码
public function __call($method, $args){
$method = strtolower($method);
$_method = substr($method, 3);
$_prop = substr($method, 0, 3);
if(!property_exists($this, $_method)){
throw new Exception('Call to undefined method '.__CLASS__.'::'.$method.'()');
}
if($_method == 'set'){
if(empty($args)){
$this->{$_prop} = null;
}else{
$this->{$_prop} = $args[0];
}
}else if($_method == 'get'){
return $this->{$_prop};
}
}
那说__call和其他魔术方法,比编写自己的方法慢得多。此外,这假设您的类属性将全部小写,如此
$this->setFoo > protected $foo;
$this->setFooToo > protected $footoo;
$this->setFoo_Too > protected $foo_too;
如果您不希望他们这样做,请更改此部分
$method = strtolower($method);
$_method = substr($method, 3);
$_prop = substr($method, 0, 3);
要
//$method = strtolower($method); -- remove this line
$_method = substr($method, 3);
$_prop = lcfirst( substr($method, 0, 3) );
然后你有
$this->setFoo > protected $foo;
$this->setFooToo > protected $fooToo;
$this->setFoo_Too > protected $foo_Too;
如果你尝试访问一个未知属性,它会抛出一个类似的错误。