3

似乎一个类的不同实例可以知道彼此的私有成员变量。

我提供了一些代码来尝试展示我的问题,我将尝试解释它。

我们有一个带有私有成员变量的类,$hidden. modifyPrivateMember将 的值设置$hidden3accessPrivateMember将 anObject作为参数并访问其私有 $hidden成员以返回其值。

示例代码:

<?php
// example.php

class Object {
    private $hidden;

    public function modifyPrivateMember() {
        $this->hidden = 3;
    }

    public function accessPrivateMember(Object $otherObject) {
        return $otherObject->hidden;
    }
}

$firstObject = new Object;
$firstObject->modifyPrivateMember();


$otherObject = new Object;
echo $otherObject->accessPrivateMember($firstObject);

上述代码的输出:

$ php example.php
3

谁能解释为什么同一类的其他实例可以访问对象的私有成员?这种表面上的违反范围是否有正当理由?

4

3 回答 3

3

这就是php的工作方式。这与 Java 的工作方式相同。有关详细信息,请参阅http://php.net/manual/en/language.oop5.visibility.php

于 2009-08-18T20:18:57.857 回答
3

private意味着它仅限于该类,而不仅仅是该对象。

于 2009-08-18T20:26:33.520 回答
1

这种行为似乎有用的唯一情况是在factory函数中:

class Object
{
    private $state;

    public static function makeObject()
    {
        $obj = new Object;
        $obj->state = 'some state';
        return $obj;
    }
}

即使在这种情况下,也有更好的解决方案,我同意你的观点,这是违反范围的,尽管我认为没有那么大。毕竟,编写类的人决定她是否需要从作为参数传递的对象中访问私有成员。所以,它可能看起来没用(即使对我来说),但你永远不知道。这不像您将内部结构暴露给子类或其他东西。这一切都发生在同一个班级,你在那里做什么是你的事。

顺便说一句,Ruby 是为每个对象而不是每个类实现访问修饰符的一种语言。

于 2009-08-18T23:08:53.507 回答