加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP OO – 如何在X之间建立类关系有很多Y.

发布时间:2020-12-13 22:54:04 所属栏目:PHP教程 来源:网络整理
导读:所以我有两个类:让我们称之为人和车 在我可以实例化之前,我需要从我的Car类中的person对象访问一些属性. 我只是简单地说一下:$car = new Car($person); ?如果是,那么如何在我的Car类中访问这些对象属性?它会是这样的: class Car{ function __construct($
所以我有两个类:让我们称之为人和车

在我可以实例化之前,我需要从我的Car类中的person对象访问一些属性.

我只是简单地说一下:$car = new Car($person);
?如果是,那么如何在我的Car类中访问这些对象属性?它会是这样的:

class Car{

    function __construct($person)
    {  
        $this->person = $person;  
    }

}

如果不是,那么实现这一目标的方法是什么?

解决方法

我们在这里有些困惑.现实世界的OOP,考虑并比较:

汽车是由一个人给予或购买的:

$person->addCar($car);

一个人正在进入汽车(坐在左前座上):

$car->addPerson($person,Car::SEAT_FRONT_LEFT);

Car :: SEAT_FRONT_LEFT是Car的公共const成员.

为了能够构造工作对象,关系在语义上是正确的.

要实现这一点,查找(Aware-)接口的含义可能会有所帮助.

我可能定义的示例类:

interface Person {
    public function getHeight();
    public function setHeight();
}

class CarOwner implements Person {
    protected $height;
    protected $cars = array();

    public function getHeight();
    public function setHeight();

    public function getCars();
};

class Driver implements Person  {
    protected $height;

    public function getHeight();
    public function setHeight();
};

class Car {
    protected $persons = array(); // @var array
    protected $readyToDrive = false;

    public const SEAT_FRONT_LEFT  = 1;
    public const SEAT_FRONT_RIGHT = 2;
    // ...

    public function addPerson(Person $person,$seat) {
        if ($person instanceof Driver) {
            $this->isReadyToDrive(true);
        }

         // I know this is stupid but you get the point:
        if ($this->getDriver()->getHeight() < 140 && $this->getSeat()->getPosition() > 40) {
            throw new Exception('please set the seat to fit your height!');
        }

        if (!in_array($person,$this->persons)) {
            $this->persons[$seat] = $person;
        }
        else {
            throw new Exception('person is already in the car!');
            // Person first needs to "leave" the car! like:
            // $car->removePerson($person)->addPerson($person,Car::SEAT_REAR_LEFT);
        }
    }


   public function getDriver() {
       if (isset($persons[self::SEAT_FRONT_LEFT]) && $persons[self::SEAT_FRONT_LEFT] instanceof Driver) {
           return persons[self::SEAT_FRONT_LEFT];
       }
       else { //... }
   }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读