6

配列をオブジェクトに変換しようとしています。魔法のメソッドを使用したい - 静的プロパティを持つ __get と __set 。

私のコード:

class UserData {
    private static  $id, $name, $login;

    public function __get($var)
    {
        return self::$var;
    }
    public function __set($var, $val)
    {
        self::{$var} = $val;
    }
}

そして設定:

foreach($userArray as $key => $val) 
    {
        DaneBilingowe::${$key} = $val;
    }

エラー: 致命的なエラー: プライベート プロパティ UserData::$id にアクセスできません

静的プロパティでマジックメソッドを使用することはできますか?

4

2 に答える 2

5

要するに、いいえ。

__get()および__set()インスタンスメソッドです。stdClass()これらは本質的に、インスタンスであるを構成する関数です。

この方法で静的コンテンツを設定する必要がある場合は、クラスに stdClass パラメータと、魔法のようにデータを設定および取得できるシングルトン構造を与えることができます。

例えば:

class UserData {
    protected static $_instance;
    protected $_data = array();

    public static function get_instance() {
        static $initialized = FALSE;

        if ( ! $initialized) {
            self::$_instance = new UserData;
            $initialized = TRUE;
        }

        return self::$_instance;
    }

    public function __get($var) {
        $self = self::get_instance();

        return isset($self->_data[$var]) ? $self->_data[$var] : NULL;
    }

    public function __set($var, $val) {
        $self = self::get_instance();

        $self->_data[$var] = $val;
    }
}

次に、次のように移動できます。

 $UserData =& UserData::get_instance();
 $UserData->var = 'val';

 echo $UserData->var; // prints 'val'

ただし、PHP でシングルトンを使用することはお勧めしません。無意味だからです。PHP シングルトン クラスのベスト プラクティスの投稿で、いくつかの理由を読むことができます。

静的クラスまたはインスタンス クラスのいずれかを使用します。

魔法のゲッターとセッターはショートカットです。通常のセッターとゲッターで同じ動作を実装できます。以下の例は同じ機能を提供しますが、意図はより明確です。

class UserData {
    protected $id, $name, $login;

    public static function set_name($name) {
        self::$name = $name;
    }

    public static function set_login($login) {
        self::$login = $login;
    }

    public static function get_id() {
        return self::$id;
    }

    public static function get_name() {
        return self::$name;
    }

    public static function get_login() {
        return self::login;
    }
}

上記のコードで $id が書き込み可能でないことに注意してください。読み取り専用です。$name と $login は読み書き可能です。通常のセッターとゲッターを使用して読み取りと書き込みを制御する方が簡単で、バグも少なくなります。魔法のメソッドはまさに魔法であり、通常、魔法は具体的ではなく、コードでは理解しにくいものです。

最後に言いたいのは、なぜ UserData が静的なのかということです。コード全体でユーザーが 1 人しかいない場合を除き、コードを静的にする意味はありません。おそらく私は全体像を把握していませんが、複数のインスタンスを持つことができるように、ID と名前を持つものをインスタンス化する必要があります。それ以外の場合、クラス自体が一意であるため、ID を持っているのはなぜですか。

于 2013-03-15T07:40:23.287 に答える
4

静的プロパティでマジック メソッドを本当に使用したい場合は、使用できますが、インスタンスが必要になります。理不尽に見えますが、プログラマーであること自体が全く理不尽です :)

また、ユーザー定義のクラスとオブジェクトは、php では動的ではありません。それらに変数を簡単に追加することはできません...したがって、以下のパターンを使用できます。

class UserData {
    private static  $id, $name, $login, $arr = [];

    public function __get($var){
        return (array_key_exists(self::$arr, $var)? self::$arr[$var]:null;
    }

    public function __set($var, $val){
        self::$arr[$var] = $val;
    }
}

そして設定: DaneBilingowe とは何ですか? 私は今ここにいません...しかし:

$inst = new UserData();

foreach($userArray as $key => $val){
    $inst->$key = $val;
}

動作します。

ただし、クラス(静的)メモリでのみ機能することに注意してください。また、名前を設定するための適切なフィルタリングがないため、奇妙なことが起こる可能性があります。(つまり、それらを追加する必要があります)

于 2013-03-15T07:58:28.123 に答える