PHP中的特殊类值

时间:2014-04-09 22:05:41

标签: php

一些代码:

class MyClass
{
   public function __get($key)
   {
       return $this[$key];
   }

   public function __set($key, $value)
   {
       $this[$key] = $value;
   }
}

$m = new MyClass();

$m->name = 'This is my class.';

OR

$m['name'] = 'This is my class.';

但不行。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:1)

为了能够使用数组访问权限访问您的类中的值,您必须实现ArrayAccess interface。为了动态任意属性名称,请从该页面复制示例代码。一旦您实施ArrayAccess方法,__get__set将按原样运作。

<?php

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
    public function __get($key) {
        return $this[$key];
    }
    public function __set($key, $value) {
        $this[$key] = $value;
    }
}

$foo = new obj();
$foo->pill = 123;
var_dump($foo->pill);

答案 1 :(得分:0)

要创建新属性,您应该这样做:

class MyClass
{
    private $data = array();

    public function __set($name, $value)
    {
        echo "Setting '$name' to '$value'\n";
        $this->data[$name] = $value;
    }

    public function __get($name)
    {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
    }
}

然后您可以在示例中按需要重载属性。

此链接可以为您提供更多参考: http://www.php.net/manual/pt_BR/language.oop5.overloading.php#language.oop5.overloading.members

答案 2 :(得分:0)

您遇到的问题是,在__get__set方法中,您将作为数组访问属性。您需要使用$this->$key代替$this[$key]

class MyClass
{
   public function __get($key)
   {
       return $this->$key;
   }

   public function __set($key, $value)
   {
       $this->$key = $value;
   }
}

$m = new MyClass();

echo "before set: \n";
var_dump($m);

$m->foo = "bar";

echo "after set: \n";
var_dump($m);

示例:http://codepad.viper-7.com/oNLbzq

答案 3 :(得分:0)

尝试这种方法

class MyClass
{
    private $m_var_data = array();

    public function __set($p_name, $p_value)
    {
        $this->m_var_data[$p_name] = $p_value;
    }

    public function __get($p_name)
    {
        if (array_key_exists($p_name, $this->m_var_data))
        {
            return $this->m_var_data[$p_name];
        }
    }
}


$m = new MyClass();

$m->name = 'This is my class.';