我可以使用属性名称来调用setter吗?

时间:2014-07-14 15:48:54

标签: php

例如,我有一个存储在变量中的类属性名称。

$name='id';

然后我想在没有在代码中写入函数名的情况下这样做。

$someObject->setId(123);

如何使用PHP来做到这一点?

4 个答案:

答案 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;

如果你尝试访问一个未知属性,它会抛出一个类似的错误。