简而言之,没有。
__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 中使用 Singleton,因为它们毫无意义。您可以在 PHP 单例类的最佳实践一文中阅读一些原因。
使用静态类或实例类。
魔术 getter 和 setter 是捷径。您可以使用普通的 setter 和 getter 实现相同的行为。下面的示例提供了相同的功能,但意图更加清晰:
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 是可读写的。使用普通的 setter 和 getter 来控制读写更容易,错误更少。魔术方法就是这样,魔术,通常魔术不是具体的,在代码中也不太容易理解。
我要说的最后一点是,为什么 UserData 是静态的?除非您的整个代码中只有 1 个用户,否则将其设为静态是没有意义的。也许我没有得到全貌,但是应该实例化具有 id 和 name 的东西,以便您可以拥有多个实例。否则,为什么要有id,因为类本身是唯一的。