PHP OOP:将对象指定为属性时执行某些操作

sbi*_*nko 3 php oop getter-setter

考虑这个假设情景:

我有一个Stomach类,它有一个contents属性,Food应该为其分配类的对象.一种方法是使用一种设定器,例如setContents($food).

但我们假设我们直接分配食物,如$stomach->contents = $orange.

假设每当Food分配一个对象时,contents我们需要将对象的eaten属性更改为true.有没有办法在不使用被分配给它的对象的方法(在这种情况下,是它$stomach的setter)的情况下做到这一点?

基本上,我的问题是:每当一个对象被指定为另一个对象的属性时,我们可以调用一个方法吗?而且,即使有可能,设计也不好吗?对不起,如果这是一个愚蠢的问题,所有这些对我来说都是新鲜的.

dua*_*led 5

这里最好的OOP解决方案是创建一个指示动作的方法,比如eat().

为了确保吃掉正确的对象,您可以定义一个接口(Say Food).该接口可以定义方法setEaten().胃(虽然我更喜欢哺乳动物或类似的东西,实际上可以吃)然后可以调用setEaten().

由于它在评论中引起了一些争议,我想指出一个对象定义应该尽可能地反映它实际上做了什么.为了减少对象耦合,最好避免直接访问其他类的对象属性,但是当它有意义时使用setter而不是动作没有任何问题(注意我在Food的定义中使用了一个),并且它可能经常取决于开发者视图.

但是,这里有道理.考虑一下"猴子吃香蕉"的情况(为简单起见,请允许我用空气来实现香蕉).

$m = new Monkey();
$m->eat(new Banana());
Run Code Online (Sandbox Code Playgroud)

完善.现在让我们尝试一下setter.

$m->setContents(new Banana());
Run Code Online (Sandbox Code Playgroud)

现在我们有一个问题,猴子已经包含很多东西,比如骨头,血液,肌肉和大脑等等.所以setContents在这里毫无意义.你可以尝试,$m->getStomach()->setContents(new Banana())但这只会增加对象耦合.

  • +1这对于魔术`__get`和`__set`来说是非常可取的*,这对于这样一个直接的用例来说是完全不必要的混淆. (2认同)