Plain Old PHP Object(POPO)这个术语到底意味着什么?

时间:2016-12-16 15:52:44

标签: php

我想知道popo。我搜索了popo,发现它代表Plain Old Php Object。 但我不确定Plain Old Php Object的确切含义。 我想知道什么是popo以及在哪里使用它? 感谢。

3 个答案:

答案 0 :(得分:12)

普通旧{在此处插入语言}对象是一种简单的方法,表示您始终不需要使用广泛的类或继承链来存储数据或执行逻辑。它允许您通过封装细节来简化对结构的理解,而不是导出细节或在其他源上创建依赖关系。

一个简单的用例可以是封装用户字段的DTO或实体:

class User  {
    public $firstName;
    public $lastName;
}

与更广泛的对象实现接口或扩展Base类或两者。

interface UserInterface {

    public function getName();
    public function setName($name);

}

class User extends Model implements UserInterface {

    public function getName()
    {
        ...
    } 

    public function setName($value) {
        ...
    }

}

根据维基百科,如果命名类没有实现任何接口或扩展任何预先存在的类,则它被视为普通对象。

我建议查看Shaunak Sontakke对用例的回答。

答案 1 :(得分:2)

来自POJO

  

在软件工程中,普通的旧Java对象(PO​​JO)是普通的   Java对象,不受任何特殊限制的约束,也不需要   任何阶级路径。

http://www.javaleaks.org/open-source/php/plain-old-php-object.html

答案 2 :(得分:2)

POPO是一个简单类的对象。当您将其作为stdClass对象时,并不意味着该对象具有严格的约定。 stdClass对象很容易被其他开发人员滥用。

制作POPO时,请考虑以下几点:

  • 所有成员变量都是私有的。与直接成员访问相比,应该使用访问器方法。
  • 公共访问器方法(getters / setters方法)
  • 类似于toJon()的公共toArray(),易于访问,易于存储/持久化的方法
  • 构造函数接受需要设置的值数组。
  • 它不应具有任何业务逻辑
  • 避免对此对象进行任何形式的验证
  • 不用担心为POPO实现接口。 [可选]
  • 如果需要方法链接,请从设置器中返回$ this。 [可选]
  • 可能是__toString()方法[可选]

何时使用它:

在这些情况下,请考虑使用POPO:

  • 跨边界传输数据。就像将数据从模型传输到控制器或从控制器传输到View或从一个应用程序传输到另一应用程序一样。在这种情况下,它的行为类似于数据传输对象(DTO)。更多详细信息-DTO vs Value Object vs POCO
  • 如果我们有json数据,则可以绑定该json数据并将其映射到POPO。因此,我们完全知道json字段中的内容。这也将确保我们的json数据始终具有一致的结构。它还将防止滥用JSON结构。
  • 如果函数的参数太多,我们可以使用“ Introduce Parameter Object”重构将所有这些参数替换为包含这些成员的POPO。
  • 用于映射database composite type

POPO是POJO的PHP变体,由Martin Fowler创造

例如:

class CPerson {

private $m_strNameFirst;
private $m_strNameLast;
private $m_fltHeight;
private $m_fltWeight;

public function __construct( $arrmixValues ) {
    $this->setNameFirst( $arrmixValues['name_first'] ?? NULL );
    $this->setNameLast( $arrmixValues['name_last'] ?? NULL );
    $this->setHeight( $arrmixValues['height'] ?? NULL );
    $this->setWeight( $arrmixValues['weight'] ?? NULL );
}

public function toArray() : array {
    return [
        'name_first' => $this->getNameFirst(),
        'name_last'  => $this->getNameLast(),
        'height'     => $this->getHeight(),
        'weight'     => $this->getWeight(),
    ];
}

public function getNameFirst() {
    return $this->m_strNameFirst;
}

public function setNameFirst( $strNameFirst ) {
    $this->m_strNameFirst = $strNameFirst;
}

public function getNameLast() {
    return $this->m_strNameLast;
}

public function setNameLast( $strNameLast ) {
    $this->m_strNameLast = $strNameLast;
}

public function getHeight() {
    return $this->m_fltHeight;
}

public function setHeight( $fltHeight ) {
    $this->m_fltHeight = $fltHeight;
}

public function getWeight() {
    return $this->m_fltWeight;
}

public function setWeight( $fltWeight ) {
    $this->m_fltWeight = $fltWeight;
}

}