如果魔术吸气剂与吸气剂结合,则通过哪种方法调用该值

时间:2013-03-12 20:08:33

标签: php class getter-setter magic-methods

如果我这样使用它(在课堂之外):

    $user_agent = $user->user_agent;        

方法get_user_agent()在构造函数中调用。

这里magic __get调用方法get_user_agent,而不返回成员变量user_agent的值。

如何避免?

class user
{
    private $user_agent;


    public function __get($key)
    {
        $value = null;

        if(method_exists($this, "get_$key"))
        {
            $value = $this->{"get_$key"}();
        }
        else
        {
            $value = $this->$key;
        }

        return $value;
    }


    public function get_user_agent()
    {
        $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
    }

2 个答案:

答案 0 :(得分:1)

设置后您忘记返回值:

public function get_user_agent()
{
    $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
    return $this->user_agent;
}

但实际上这实在令人困惑,因为你不会指望一个前缀为' get'在返回之前先分配/定义任何东西。这是__set()的用途。在这种情况下,您甚至可能希望在__construct()方法中执行此操作:

class user
{
    private $user_agent;

    public function __construct() {
        $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
    }

    public function __get($key) {

        if(method_exists($this, "get_$key"))  {
            return $this->{"get_$key"}();
        } else {
            return isset($this->{$key}) ? $this->{$key} : null;
        }

    }

    public function __set($var, $val) {
        //only allow to set existent attributes
        if( isset($this->{$var} ) ) {
            $this->{$var} = $val;
        }
    }

    public function get_user_agent() {
        return $this->user_agent;
    }
}

因此get-method不是分配属性的地方。在上面的示例中,它在构造函数中赋值。但如果您愿意,可以稍后更改/分配:

$user = new user(); //constructor-method is called, $user_agent is set now

但您也可以稍后自行设置:

$user->user_agent = $_SERVER['HTTP_USER_AGENT'];  //the magic __set()-method is called

echo 'Your user agent is: ' . $user->user_agent;

答案 1 :(得分:0)

这里的主要问题是get_user_agent实际上并没有返回任何内容。你可以尝试:

 public function get_user_agent()
 {
     $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
     return $this->user_agent;
 }