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 に答える