2010-09-28 115 views
0

我正在写一些PHP。我有几个类没有声明任何属性,公开或其他。我有一个从MySQL获取对象和设置属性值,像这样的新init'd PHP对象定制的MySQL类...PHP自动属性/超载

while ($row = mysql_fetch_assoc($result)) 
{ 
    foreach($row as $key => $value) 
    { 
     $this->{$key} = $value;   
    } 
} 

这似乎很好地工作,因为我可以调用所述性质的任何地方我请... $this->my_auto_property等我找不到任何PHP文档描述这是一种重载类对象的属性的方式。

这样好吗?我想确保它不会在未来的PHP版本中出现某种向后兼容性。

回答

0

这不是重载任何属性,它只是使用变量设置一个属性。动态创建新属性一直是PHP的一项功能。当然,没有人能保证它不会被弃用,但PHP支持弱打字的方式我认为不太可能。

另一种方法是将值存储在一个数组中,并创建一个神奇的__get accessor来阅读它们,如果你想增加封装和对可访问性的控制。

+0

我第二使用访问超载多一点面向未来的保险。 – 2010-09-28 03:47:23

0

尝试这样:

<?php 
/** 
* This class creates a dynamic shell to 
* define and set any Setter or Getter 
* 
* Example: 
* 
* $property = new DynamicProperties(); 
* $property->setFax("123-123-1234"); // set[anything here first letter upper case]("value here") 
* echo $property->getFax()."\n"; // get[anything here first letter upper case]() 
*/ 

class DynamicProperties { 
    private $properties; 

    public function __call($name, $args) { 
     if (preg_match('!(get|set)(\w+)!', $name, $match)) { 
      $prop = $match[2]; 
      if ($match[1] == 'get') { 
       if (count($args) != 0) { 
        throw new Exception("Method '$name' expected 0 arguments, got " . count($args)."\n"); 
       } 
       return $this->properties[$prop]; 
      } else { 
       if (count($args) != 1) { 
        throw new Exception("Method '$name' expected 1 argument, got " . count($args)."\n"); 
       } 
       $this->properties[$prop] = $args[0]; 
      } 
     } else { 
      throw new Exception("Unknown method $name"); 
     } 
    } 
} 
?>