代码如下:
/** PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。 * */
// __toString、__set、__get__isset()、__unset()
/*
The __toString method allows a class to decide how it will react when it is converted to a string.
__set() is run when writing data to inaccessible members.
__get() is utilized for reading data from inaccessible members.
__isset() is triggered by calling isset() or empty() on inaccessible members.
__unset() is invoked when unset() is used on inaccessible members.
*/
class TestClass {
private $data = array();
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
public function __set($name, $value) {
echo "__set, Setting '$name' to '$value'/n";
$this->data[$name] = $value;
}
public function __get($name) {
echo "__get, Getting '$name'/n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
}
/** As of PHP 5.1.0 */
public function __isset($name) {
echo "__isset, Is '$name' set?/n";
return isset($this->data[$name]);
}
/** As of PHP 5.1.0 */
public function __unset($name) {
echo "__unset, Unsetting '$name'/n";
unset($this->data[$name]);
}
}
$obj = new TestClass('Hello');
echo "__toString, $obj/n";
$obj->a = 1;
echo $obj->a . "/n/n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "/n/n";
/**
输出结果如下:
__toString, Hello
__set, Setting 'a' to '1'
__get, Getting 'a'
__isset, Is 'a' set?
bool(true)
__unset, Unsetting 'a'
__isset, Is 'a' set?
bool(false)
**/
// __call __callStatic
/*
mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments )
__call() is triggered when invoking inaccessible methods in an object context.
新闻热点
疑难解答