奇怪的工作PHP代码有关受保护的可见性

时间:2011-03-24 07:21:36

标签: php visibility

class Fruit {
    protected $blend;

    public function WillItBlend() {
        return $this->blend;
    }
    public static function MakeFruit() {
        $objF = new Fruit();
        $objF->blend = true;
        return $objF;
    }
}

$fruit = Fruit::MakeFruit();
echo $fruit->WillItBlend();

为什么这条线工作

$objF->blend = true;
而不是抛出致命错误?

3 个答案:

答案 0 :(得分:2)

可见性修饰符在类级别工作,而不是在对象级别。这也意味着同一类的对象可以访问彼此的私有位。

PHP交互式提示示例:

php > class Foo {
        private $bar;
        public function __construct() { $this->bar = rand(1, 100); } 
        public function baz($another_foo) { echo $another_foo->bar, '-', $this->bar; }
    }
php > $a = new Foo();
php > $b = new Foo();
php > $a->baz($b);
86-70

答案 1 :(得分:1)

$objF是类Fruit的实例。

$objF->blend正在课堂上使用。 Protected属性可以在类本身中使用。

如果您在课外使用$fruit->blend;

,则会收到致命错误

所以允许这样做。

答案 2 :(得分:0)

因为你是从班级内部访问的,如果你要从班级外面打电话

$fruit = Fruit::MakeFruit();
echo $fruit->WillItBlend();
echo $fruit->blend; 

它会引发致命的错误。