访问同一类的另一个对象的受保护属性的方法

Posted

技术标签:

【中文标题】访问同一类的另一个对象的受保护属性的方法【英文标题】: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 的行为与描述的一样——不能在不同的实例上调用私有方法。 【参考方案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 也有这个。

【讨论】:

以上是关于访问同一类的另一个对象的受保护属性的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个类的静态方法中访问类的受保护变量?

无法访问子类中的受保护方法[重复]

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

PHP 从静态方法访问对象的受保护属性

Python - 访问类的受保护成员_

C++ 派生模板类:访问实例的受保护成员