【问题标题】:Method accessing protected property of another object of the same class访问同一类的另一个对象的受保护属性的方法
【发布时间】:2010-12-19 05:14:10
【问题描述】:

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

我正在用 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 错误还是预期的行为(我将不得不重新学习这个概念...... :))(并且有参考事实)?在其他编程语言中是如何实现的?

谢谢!

【问题讨论】:

  • 注意。 Ruby 的 private 的行为与描述的一样——不能在不同的实例上调用私有方法。

标签: php class object instance visibility


【解决方案1】:

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

$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.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 2016-01-16
      • 2012-05-09
      • 2013-10-02
      • 2019-10-06
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多