如果我这样使用它(在课堂之外):
$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'];
}
答案 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;
}