sbi*_*nko 3 php oop getter-setter
考虑这个假设情景:
我有一个Stomach
类,它有一个contents
属性,Food
应该为其分配类的对象.一种方法是使用一种设定器,例如setContents($food)
.
但我们假设我们直接分配食物,如$stomach->contents = $orange
.
假设每当Food
分配一个对象时,contents
我们需要将对象的eaten
属性更改为true
.有没有办法在不使用被分配给它的对象的方法(在这种情况下,是它$stomach
的setter)的情况下做到这一点?
基本上,我的问题是:每当一个对象被指定为另一个对象的属性时,我们可以调用一个方法吗?而且,即使有可能,设计也不好吗?对不起,如果这是一个愚蠢的问题,所有这些对我来说都是新鲜的.
这里最好的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())
但这只会增加对象耦合.