为什么可以在对象中的同一个类的对象实例上设置私有成员?

时间:2014-02-02 15:29:16

标签: php

有人可以解释为什么我可以在$bar设置私人会员TestFoo::getFooInstance()吗?

然而,

TestFoo::getFoo2Instance()会返回致命错误。

我一直认为私有成员只能从同一个对象实例而不是同一个对象类访问?

<?php

class TestFoo  {

    private $bar;

    public static function getFooInstance()
    {
        $instance = new TestFoo();
        $instance->bar = "To bar or not to bar";
        return $instance;
    }

    public static function getFoo2Instance()
    {
        $instance = new TestFoo2();
        $instance->bar = "To bar or not to bar";
        return $instance;
    }

    public function getBar()
    {
        return $this->bar;
    }
}

class TestFoo2 {
    private $bar;
    public function getBar()
    {
        return $this->bar;
    }
}

$testFoo = TestFoo::getFooInstance();
echo $testFoo->getBar();

// returns PHP fatal error
//$testFoo2 = TestFoo::getFoo2Instance();
//echo $testFoo2->getBar();
?>

1 个答案:

答案 0 :(得分:5)

protectedprivate属性背后的想法是一个类想要从外部代码中隐藏它们。不是作为安全措施的衡量标准,而是因为这些属性仅供类内部使用,不应该是其他代码的公共接口。任何public都可以被其他代码使用,并且应该保持不变以防止其他代码破坏。 privateprotected属性和方法只能由类本身使用,因此如果您需要重构或更改它们,则保证更改本地化为类本身,并且您保证不会打破其他任何事情。

因此允许类修改属性并调用其类型的任何对象实例的方法,因为可以信任类本身来了解它自己的实现。