8

一个对象的方法是否应该能够访问同一类的另一个对象的受保护属性?

我正在用 PHP 编码,我刚刚发现对象的受保护属性允许被同一类的方法访问,即使不是同一个对象也是如此。

在示例中,首先,您将在输出中得到“3” - 因为函数 readOtherUser 将成功访问该值 - 之后将发生 PHP 致命错误 - 因为主程序将无法访问相同的值.

<?php

class user
{
protected $property = 3;

public function readOtherUser ()
{
    $otherUser = new user ();
    print $otherUser->property;
}
}

$user = new user ();

$user->readOtherUser ();
print $user->property;

?>

这是一个 PHP 错误还是预期的行为(我将不得不重新学习这个概念...... :))(并且是否有对事实的引用)?它是如何在其他编程语言中完成的?

谢谢!

4

2 回答 2

8

这是有意的。甚至可以访问同一类的私有成员。因此,将修饰符视为类修饰符,而不是对象修饰符。

PHP 不是唯一具有此功能的语言。例如 Java 也有这个。

于 2009-11-22T13:26:48.630 回答
2

这是预期的行为。受保护的变量或函数意味着它可以被同一个类或从该类继承的任何类访问。一个受保护的方法只能在类中调用,例如你不能这样调用它:

$object = new MyClass();
$object->myProtectedFunction();

这会给你一个错误。但是,在定义的类“MyClass”中,您可以完美地调用受保护的函数。

同样适用于变量。总结:

use PROTECTED on variables and functions when:
 1. outside-code SHOULD NOT access this property or function.
 2. extending classes SHOULD inherit this property or function.
于 2009-11-22T13:25:22.710 回答