<?php
class classname
{
public $attribute;
function __get($name)
{
return 'here:'.$this->$name;
}
function __set ($name, $value)
{
$this->$name = $value;
}
}
$a = new classname();
$a->attribute = 5;
echo $a->attribute;
当我在脚本上面运行时,显示:5
问题:
echo $a->attribute;
这行代码会调用function __get($name)
,对吗?那么为什么它没有显示:here:5
?
答案 0 :(得分:2)
您已将该属性标记为公开,因此可以从该类外部访问该属性。
__ get()用于从无法访问的属性中读取数据。
http://www.php.net/manual/en/language.oop5.overloading.php#object.get
如果要强制任意属性调用__get和__set,可以将它们存储在私有映射中:
class classname
{
private $vars = array();
function __get($name)
{
return 'here:'.$this->vars[$name];
}
function __set ($name, $value)
{
$this->vars[$name] = $value;
}
}
答案 1 :(得分:1)
只有在调用范围内未定义或无法访问属性属性或方法或未定义时,才会调用magic __get和__set以及__call。
要完成此项工作,您必须删除对属性的公开引用,或将其设为受保护或私有。
class classname
{
protected $attribute;
function __get($name)
{
return 'here:'.$this->$name;
}
function __set ($name, $value)
{
$this->$name = $value;
}
}
$a = new classname();
$a->attribute = 5; // calling __set
echo $a->attribute; // calling __get
答案 2 :(得分:0)
这里'属性'是公共的,所以不会调用__get()魔术方法。