__get() && __set()
以下是官方文档的解释
__set() is run when writing data to inaccessible properties.
当给很难接近的属性写入数据时(函数)__set()执行
__get() is utilized for reading data from inaccessible properties.
__get()被用来读取很难接近的属性的数据
inaccessible properties
可以包括:
- 私有属性
- 没有初始化的属性
下面演示一下对于没有初始化的属性的访问和赋值
code
class Object
{
}
$obj = new Object();
echo $obj->name;
result
PHP Notice: Undefined property: Object::$title in /root/learnphp/index.php on line 7
code
class Object
{
protected $array = array();
function __set($key, $value)
{
$this->array[$key] = $value;
}
function __get($key)
{
if (array_key_exists($key, $this->array)) {
return $this->array[$key];
} else {
return null;
}
}
}
result
$obj = new Object();
echo "---\n";
echo $obj->name;
echo "---\n";
$obj->name = 'obj';
echo $obj->name;
上面演示了对于没有初始化的属性的访问和赋值,inaccessible properties 还包括另一种,就是私有属性,这个相对来说就比较简单,下面写一个demo
code
class Object
{
private $name = "private obj";
function __set($key, $value)
{
if (property_exists($this, $key)) {
$this->$key = $value;
}
}
function __get($key)
{
if (property_exists($this, $key)) {
return $this->$key;
} else {
return null;
}
}
}
$obj = new Object();
echo $obj->name;
echo "\n---\n";
$obj->name = 'obj';
echo $obj->name;
result
private obj
---
obj
__call()
__call() is triggered when invoking inaccessible methods in an object context.
上面是官方文档中的一句话,翻译过来就是在对象中调用一个不可访问的方法时,__call()会被调用,和__get()一样,只不过一个对应的是方法,一个对应的是属性,下面看一下测试
code
class Object
{
}
$obj = new Object();
$obj->show("Hello", "World", 9);
result
PHP Fatal error: Call to undefined method Object::show() in /root/learnphp/index.php on line 18
code
class Object
{
function __call($name, $arguments)
{
var_dump($name, $arguments);
}
}
$obj = new Object();
$obj->show("Hello", "World", 9);
result
string(4) "show"
array(3) {
[0]=>
string(5) "Hello"
[1]=>
string(5) "World"
[2]=>
int(9)
}
我们可以看到__call()确实实现了访问没有定义的方法的方法,那么__call()到底用来干嘛呢,其实__call()可以帮我们实现重载,具体的资料大家可以上网搜索
__callStatic()
__callStatic()其实和__call()一样,后者是对象中调用一个不可访问的方法时执行,前者在类调用一个不可访问的方法时调用。
code
class Object
{
static function __callStatic($name, $arguments)
{
var_dump($name, $arguments);
}
}
Object::show("Hello", "World", 9);
result
string(4) "show"
array(3) {
[0]=>
string(5) "Hello"
[1]=>
string(5) "World"
[2]=>
int(9)
}
转载自北城的技术博客