我已经知道OOP是关于数据封装的,但是在彼此无关的类之间传递数据怎么样(以下示例是否值得使用extends
)?
class Dog {
private $secretVar;
public function getSecretVar() {
$this->secretVar = 'psst... only for rainbow!';
return $this->secretVar;
}
}
class Rainbow {
public function __construct(Dog $Dog) {
print_r($Dog->getSecretVar());
}
}
$Dog = new Dog();
$Rainbow = new Rainbow($Dog);
// ... classes that don't need the $secretVar
如何仅为$secretVar
和Dog
类封装Rainbow
?截至目前,任何人都可以打电话给getSecretVar()
,我很难让它发生,因为它似乎打败了整个封装点。
答案 0 :(得分:0)
对于一只狗来说,延伸彩虹是没有意义的,反之亦然只是为了分享一个变量。
你所要求的可能是可能的,但我不知道。如果是使用friend
可见性的C ++,那肯定是可能的。
在这种情况下,您必须使其public
或使用getter和setter。
答案 1 :(得分:0)
封装不是为了隐藏变量的值来从程序的其余部分隐藏,而是完全控制程序的其余部分如何访问变量。
通过声明变量private,您可以检查它可以设置的值,并且可以在任何人读取之前对其进行更改。
试图让只有一些类读取变量是没有意义的。
你要做的是通过使用反射来检查哪个类和方法调用getSecretVar()方法,但它几乎没用。
答案 2 :(得分:0)
在您的情况下,您可以像这样使用protected
:(扩展到hasSecret的每个类都可以访问它。)
<?php
class HasSecret {
protected $secretVar = 'psst... only for rainbow!';
}
class Dog extends HasSecret {
public function getSecretVar() {
return $this->secretVar;
}
}
class Rainbow extends HasSecret {
public function __construct(Dog $Dog) {
print_r($Dog->getSecretVar());
}
}
$Dog = new Dog();
$Rainbow = new Rainbow($Dog);
答案 3 :(得分:0)
这是一个解决方案,但它很难看。
class Dog {
private $secretVar = 'psst... only for rainbow!';
public function getSecretVar($caller == NULL) {
// Here's the trick...
if (get_class($caller) == 'Rainbow') {
return $this->secretVar;
} else {
return '';
}
}
}
class Rainbow {
public function __construct(Dog $Dog) {
print_r($Dog->getSecretVar($this));
}
}
$Dog = new Dog();
$Rainbow = new Rainbow($Dog);
// ... classes that don't need the $secretVar
这很难看,因为它难以维护而且不直观。如果你真的需要这样做,那很可能是你设计中的一个缺陷。