PHP范围和类实例交互

时间:2009-08-18 20:14:29

标签: php scope visibility

似乎类的不同实例可以了解彼此的私有成员变量。

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

我们有一个包含私有成员变量$hidden的类。 modifyPrivateMember$hidden的值设置为3accessPrivateMemberObject作为参数,访问其私有 $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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

private表示它仅限于该类,而不仅仅是该对象。

答案 2 :(得分:1)

此行为似乎有用的唯一情况是factory函数:

class Object
{
    private $state;

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

即使在这种情况下,也有更好的解决方案,我同意你的说法,这是违反范围的,尽管在我看来并不是那么大。毕竟,编写类的人决定是否需要从作为参数传递的对象访问私有成员。所以,它似乎毫无用处(即使对我来说),但你永远不会知道。这并不像你将你的内部暴露给子类或其他东西。这一切都发生在同一个班级,而你的业务就是你在那里做的事情。

顺便说一下,每个对象实现访问修饰符的一种语言是Ruby。