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

Web*_*per 11 php

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

Dev*_*von 17

Plain Old {Insert Language Here}对象是一种简单的方法,表示您并不总是需要使用广泛的类来存储数据或执行逻辑.

在PHP中,您可以通过实例化stdClass来创建"普通"对象.

class User  {
    public $firstName;
    public $lastName;
}
Run Code Online (Sandbox Code Playgroud)

与实现接口的更广泛的对象:

interface UserInterface {

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

}

class User extends Model implements UserInterface {

    public function getName()
    {
        ...
    } 

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

}
Run Code Online (Sandbox Code Playgroud)

我认为一个简单的对象__CODE__,但根据维基百科,如果命名类没有实现任何接口或扩展任何预先存在的类,则它被视为普通对象.


Sha*_*kke 7

POPO 是一个简单类的对象。当您将其作为 stdClass 对象时,它不是您在该对象中拥有的内容的严格契约。stdClass 对象很容易被其他开发人员滥用。

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

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

何时使用:

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

  • 跨边界传输数据。就像将数据从模型传输到控制器或从控制器传输到视图或从一个应用程序传输到另一个应用程序一样。在这种情况下,它的行为类似于数据传输对象 (DTO)。更多细节 - DTO vs 值对象 vs POCO
  • 如果我们有 json 数据,我们可以绑定该 json 数据并将其映射到 POPO。所以我们确切地知道 json 字段中有什么。这也将确保我们的 json 数据始终具有一致的结构。它还可以防止滥用 JSON 结构。
  • 如果函数的参数太多,我们可以使用“引入参数对象”重构来用包含这些成员的 POPO 替换所有这些参数。
  • 用于映射数据库复合类型

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;
}

}
Run Code Online (Sandbox Code Playgroud)