类属性为Array而不是变量

时间:2015-10-28 11:32:29

标签: php oop

我开始使用PHP中的类。

我一直在阅读,我注意到PHP就是阵列。

所以我想知道在数组中使用类属性并在键之后命名它们是否是一个好习惯。

像这样:

job n

这是常见的做法。

但是这样做:

private $prefix;
private $name;
public function setPrefix($p)
{
    $this->prefix = $p;
}
public function getPrefix()
{
    return $this->prefix;
}
public function setName($n)
{
    $this->name = $n;
}
public function getName()
{
    return $this->name;
}

这会比普通方式更好吗?我相信这将是任何数据库表的泛型类结构。

2 个答案:

答案 0 :(得分:3)

  

这会比普通方式更好吗?

即可。事实上它有缺点。

  • 它删除了属性的公共,受保护和私有封装(这是oop的本质)。
  • 在每个变量访问上添加一个图层。我真的不知道php的内部,但我真的不认为它可能比原生属性更快。 (虽然差异可能与任何脚本完全无关)
  • IDE在访问媒体资源时无法完成您的代码。

它可以有它的用途,如果你的类是一个需要有一个内部数据数组的容器,在这种情况下你会class container implements ArrayAccess并像数组一样使用它,而不是全局获取/设置方法。这里是ArrayAccess()

的文档
$obj = new container();
$obj['key'] = "value";
echo $obj['key'];

底线

为什么要尝试重新发明轮子?酒店是一处房产。将每个属性包装在另一个属性中没有任何逻辑或语义上的改进。它阻碍了一切。它不会更快,它不会更清晰,它会从你的属性中删除oop概念,而且它首先违背当前使用对象的现状。

关于更轻松的数据库管理

如果您确实希望轻松地将数组传递给预准备语句,则可以使用get_object_vars($obj)获取对象的属性,为此目的,不需要将它们放入数组中。此外,作为notedCypher,您无法使用内置的fetchObject()方法,这样可以让您更轻松地获得无法获得的时间时间查询数据库。

答案 1 :(得分:0)

这样可以轻松实现数据库操作的自动化。

但是会让人很难使用这个物体。

Yii(2)使用此设置作为ActiveRecords的一部分,但将其扩展 将属性定义为注释

/**
 * @property int $id
 * @property string $name
 */
class SomeClass extends AbstractModel 

并且还实现了魔术方法:__get(),__ set()`因此您可以轻松设置和获取这样的属性:

class AbstractModel{

public function __get($name){ 
    if(isset($this->data[$name])){
        return $this->data[$name]; 
    }else{
        throw new Exception("Undefined or property '$name'");
    }
}

public function __set($name, $value){
    if(isset($this->data[$name])){
        return $this->data[$name] = $value;
    }else{
        throw new Exception("Undefined or property '$name'");
    }
}