我正在写一些PHP。我有几个类没有声明任何属性,公共或其他。我有一个自定义的mySQL类,它从mySQL中获取对象,并为新初始化的PHP对象设置属性值,如此...
while ($row = mysql_fetch_assoc($result))
{
foreach($row as $key => $value)
{
$this->{$key} = $value;
}
}
这似乎工作得很好,因为我可以在任何地方调用所述属性... $this->my_auto_property
等。我找不到任何PHP文档将这描述为一种重载类对象属性的方法。
这可以吗?我想确保它不是某种向后兼容性,在将来的PHP版本中会消失。
答案 0 :(得分:0)
这不会重载任何属性,它只是使用变量设置属性。动态创建新属性一直是PHP的一个特性。当然,没有人可以保证它不会被弃用,但PHP支持弱打字的方式我认为这不太可能。
另一种方法是将值存储在数组中并创建一个魔术__get
accessor来读取它们,如果你想增加封装和对可访问性的控制。
答案 1 :(得分: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");
}
}
}
?>