我正在学习Prado php框架一段时间了,我一直想知道一个功能,如果它来自PHP或以某种方式在Prado中实现。
即,Prado中使用的类可以使用未在类本身中声明但由set和get方法“定义”的属性(字段)。
以下是一个例子:
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功能?
THX
答案 0 :(得分:1)
这既不是PHP功能也不是Prado功能。 我不知道普拉多,但PHP没有这样的功能,所以普拉多也不能拥有它;)
您正在寻找的是这样的事情:$this->myUndefinedMember = $something
您的示例使用本地变量,这些无法自动设置和读取。
这将调用魔术__set
方法,如果定义为。
Prado可以(我不知道是否这样)为您经常使用的某个超类定义此方法,然后动态检查是否已为该变量名定义了setter方法。
签名如下:
public function __set($name, $value)
maigc方法__get($name)
类似。
如果您未将其设置为公开,则只能在类(或子类)中使用此类属性的功能。
作为参考,请参阅有关PHP5功能的here或重载属性和方法。
示例实现可能如下所示:
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
}
}
答案 1 :(得分:1)
我回答的很晚,但我觉得答案对一个简单的功能非常困惑。
给出一个更简单的答案。从TComponent继承的任何Prado类都使用__set和__get函数。
有关php magic functions here
的更多信息因此,如果你有一个以“get”或“set”开头的函数,那么当使用函数名的其余部分作为字段时,它们将被调用。
这是__get的实际普拉多代码__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);
}
}