题
我正在学习Prado PHP框架已有一段时间了,我一直想知道一项功能是否来自PHP或Prado中以某种方式实施。
也就是说,Prado中使用的类可以利用类本身中未声明的属性(字段),而是通过设置和获取方法“定义”。
这是一个例子:
class myClass extends somePradoClass {
public function myPradoMethod() {
$MyVariable = 22;
echo $MyOtherVariable; // this one is read only (only get method defined)
}
public function getMyVariable() {
return 0;
}
public function setMyVariable($value) {
$this->isFieldFromParentClass = $value;
}
public function getMyOtherVariable() {
return $this->isOtherFieldFromParentClass;
}
}
现在,以某种方式使用$ myvariable和$ myothervariable在整个班级中都很好,就好像它们被称为班级属性一样。
因此,再次提问: 这是PHP还是Prado功能?
谢谢
解决方案
这既不是PHP功能也不是Prado功能。我不知道Prado,但是PHP没有这样的功能,因此Prado也不能拥有;)
但是,您要寻找的是这样的东西: $this->myUndefinedMember = $something
您的示例使用 本地变量, , 这些 不能 设置并自动读取。
这会唤起魔术 __set
方法,如果是定义的。
Prado可以(我不知道它是否确实如此)为您通常使用的某个超级阶级定义了此方法,然后动态检查是否已为该变量名称定义了一个设置器方法。
签名如下:
public function __set($name, $value)
MAIGC方法 __get($name)
类似工作。
如果您不将其设置为公开,则只能从类(或子类)中使用此类似属性的功能。
作为参考,请参阅 这里 关于PHP5的功能或过载属性和方法。
更新
样本实现看起来像这样:
class MyMagicSuperClass{
public function __get($name){
$getter_name = 'get'.ucwords($name);
if(method_exists($this, $getter_name){
return $this->$getter_name();
}
//error handling
}
public function __set($name, $value){
$setter_name = 'get'.ucwords($name);
if(method_exists($this, $setter_name){
return $this->$setter_name($value);
}
//error handling
}
}
其他提示
我对此很晚回答,但我感到答案对一个简单的功能感到非常困惑。
给出更简单的答案。从tcomponent继承的任何PRADO类都使用__SET和__GET函数。
有关PHP魔术功能的更多信息 这里
因此,如果您具有以“ get”或“ set”开头的函数,则在使用其余函数名称作为字段时将被调用。
这是__get的实际prado代码__set大约相同
public function __get($name)
{
$getter='get'.$name; $jsgetter = 'getjs'.$name;
if(method_exists($this,$getter))
{
// getting a property
return $this->$getter();
}
else if(method_exists($this,$jsgetter))
{
// getting a property
return (string)$this->$jsgetter();
}
else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
{
// getting an event (handler list)
$name=strtolower($name);
if(!isset($this->_e[$name]))
$this->_e[$name]=new TList;
return $this->_e[$name];
}
else
{
throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);
}
}
不隶属于 StackOverflow