当前位置: 首页 > 知识库问答 >
问题:

为什么可以在对象内同一类的对象实例上设置私有成员?

诸葛亮
2023-03-14

有人能解释为什么我能在TestFoo::getFooInstance()中设置私有成员$bar

TestFoo::getFo2Instance()但是返回一个致命错误。

我总是假设私有成员应该只能从同一个对象实例而不是同一个对象类访问?

<?php

class TestFoo  {

    private $bar;

    public static function getFooInstance()
    {
        $instance = new TestFoo();
        $instance->bar = "To bar or not to bar";
        return $instance;
    }

    public static function getFoo2Instance()
    {
        $instance = new TestFoo2();
        $instance->bar = "To bar or not to bar";
        return $instance;
    }

    public function getBar()
    {
        return $this->bar;
    }
}

class TestFoo2 {
    private $bar;
    public function getBar()
    {
        return $this->bar;
    }
}

$testFoo = TestFoo::getFooInstance();
echo $testFoo->getBar();

// returns PHP fatal error
//$testFoo2 = TestFoo::getFoo2Instance();
//echo $testFoo2->getBar();
?>

共有1个答案

马梓
2023-03-14

protected私有属性背后的思想是,类希望隐藏这些属性,不让外部代码知道。不是作为安全性的度量,而是因为这些属性仅供类内部使用,不应该是其他代码的公共接口。任何公共的都可以被其他代码使用,并且应该保持不变,以防止其他代码中断。私有的受保护的属性和方法只能由类本身使用,所以如果需要重构或更改它们,这些更改保证是本地化到类本身的,并且保证不会破坏任何其他内容。

因此,允许类修改属性并调用其类型的任何对象实例的方法,因为可以信任类本身了解其自身的实现。

 类似资料:
  • 问题内容: 我正在学习Java,正在阅读的书中包含以下有关克隆的示例。在中,即使buffer是,我的第一个实例也可以在新对象上设置缓冲区。似乎应该要求该字段才能起作用。 为什么允许这样做?是否具有允许其访问字段的特殊特权? 问题答案: 该修改并不意味着只有同一个实例可以访问域; 这意味着只有相同类的对象才能访问它。 在Java语言规范说,在6.6节,访问控制: …如果成员或构造函数被声明为私有,则

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 我需要将一些html转换为PDF。我遇到了IText7,它看起来是一个很好的解决方案。 我正在. net core 3.1中开发 但是,即使使用它的基本实现,我也会遇到一个错误: 每个人都喜欢这个错误: 对象引用未设置为对象的实例。 内部异常为null,唯一的线索是SerializationStackTraceString是: 在iText. IO. FontCache. cctor() 那么,它

  • 是否有建议使用具有段落的单元格构建表,以避免在向表或文档添加单元格时出现异常?我明白了,但我不知道会发生什么: 以下是使用Windows控制台项目的简单快照(与实际项目相比): 注意,注释的代码行: 添加它可以作为一种变通方法,使文档能够毫无例外地呈现。

  • 问题内容: 我只是想知道… 为什么我只有一个Calendar对象实例。有一个单例的原因吗? 我试图阅读文档,但他们没有提及为什么需要这样做。快速谷歌搜索没有给我任何答案。 问题答案: 日历不是单例,它是一个抽象类。该方法是一个Factory方法,它返回Calendar类的具体实现。 在Google上搜索java.util.Calendar源代码,您将看到它的工作方式。

  • 我试图按照iText7文档中的一些内容在我的pdf文档中插入一个标题,但是GetPageSize()返回'Object reference not set to a Object实例‘。 我尝试通过PdfDocument对象和Document对象添加页面,并设置页面大小。我可以在循环中看到4页,但是,我所做的任何更改都不会给我一个页面大小。 错误消息System.NullReferenceExce