如何处理不同类型的对象


How to handle different types of objects?

我在PHP代码中发现了一个问题。我习惯于用对象和管理器编写PHP代码。例如:Photo是一个对象,PhotoManager则是一个管理器。我还有一个User对象和一个UserManager。

请参阅以下代码:

<?php
class Photo
{
    public $id;
    public $name;
    public $user;
    public function __construct($id, $name, User $user)
    {
        $this->id = $id;
        $this->name = $name;
        $this->user = $user;
    }
}
?>
<?php
class User
{
    public $id;
    public $name;
    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}
?>
<?php
class PhotoManager
{
    public function loadAll()
    {
        // load all photos (array with objects)
    }
    public function loadById($id)
    {
        // return a single photo (object)
    }
}
?>
<?php
class UserManager
{
    public function loadAll()
    {
        // load all users (array with objects)
    }
    public function loadById($id)
    {
        // return a single user (object)
    }
}
?>

这很好用。请不要说,在我当前的代码中,经理的规模要大得多,拥有各种功能。

我这样使用经理:

<?php
$userManager = new UserManager();
$photoManager = new PhotoManager();
?>

问题是我想将User对象添加到Photo中。那么,在PhotoManager中使用UserManagerhoto对象加载User时,我想从UserManager访问loadById函数。

您应该修改PhotoManager以将UserManager加载为属性:

class PhotoManager
{
    private $userManager;
    public function __construct() {
        $this->userManager = new UserManager();
    }
    public function loadAll()
    ....

进行此更改后,您可以通过$this->userManager->loadById()访问UserManager的loadById()

这看起来像MVP设计,我真的不建议这样做,但如果你真的必须这样做,你可以让Photo和User实现一个通用接口,或者在照片管理器中有一个userManager,反之亦然