PHP将数据传递给特定类? (数据封装)

时间:2012-10-21 22:32:24

标签: php

我已经知道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

如何仅为$secretVarDog类封装Rainbow?截至目前,任何人都可以打电话给getSecretVar(),我很难让它发生,因为它似乎打败了整个封装点。

4 个答案:

答案 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

这很难看,因为它难以维护而且不直观。如果你真的需要这样做,那很可能是你设计中的一个缺陷。