1

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

    $user_agent = $user->user_agent;        

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

这里魔术 __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'];
    }
4

2 回答 2

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方法不是分配属性的地方。在上面的例子中,它是在构造函数中赋值的。但如果您愿意,您可以稍后更改/分配它:

$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;
于 2013-03-12T20:17:10.243 回答
0

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

 public function get_user_agent()
 {
     $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
     return $this->user_agent;
 }
于 2013-03-12T20:13:33.433 回答