【问题标题】:OOP visibility in PHPPHP 中的 OOP 可见性
【发布时间】:2014-10-25 09:41:09
【问题描述】:

我最近开始使用 PHP 进行 OOP,并且我正在研究可见性概念(公共、受保护、私有)。在这里,我对受保护的可见性感到困惑。受保护的成员只能在声明类或子类或子类中访问。我在 PHP 的网站上有这个例子:

class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}


class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->protected; // Fatal Error
echo $obj2->private; // Undefined
$obj2->printHello(); // Shows Public, Protected2, Undefined

在此代码的倒数第三行 (echo $obj2->protected; // Fatal Error) 中,它给出了致命错误。但是在这种情况下,受保护的变量不是继承到 MyClass2 的子类中吗?那么为什么会出现这个致命错误呢?有人可以请教我吗?

【问题讨论】:

  • 您正在尝试访问两个类范围之外的protected 成员。
  • echo $obj2->protected; // Fatal Error 这一行在两个类之外。那它应该如何工作?它只能以这种方式与公众一起使用
  • 并且您已经在printHello 方法中证明了您的孩子可以访问父母的受保护财产。
  • @Hanky웃Panky 他只是直接从 PHP 手册中复制粘贴
  • 好的,我知道了。谢谢。受保护的变量成为继承类的成员,我们不能直接在其中回显它,而是借助它在 MyClass2 类的 printHello() 函数中执行的函数。再次感谢。

标签: php oop


【解决方案1】:

受保护的成员只能在声明类访问,或者 子类或子类。

你必须注意

您收到致命错误是因为您正在从外部MyClass2MyClass 访问$protected

Within 意味着您可以从 MyClass2 访问它,就像您在 MyClass2::printHello() 和/或 MyClass::printHello() 方法上所做的那样。

【讨论】:

  • 好的,谢谢,我明白了,但我有一个相关的困惑。我们可以在声明类中回显变量,还是必须在类外部创建一个对象,然后通过对象访问类变量并回显它?这听起来可能很愚蠢,但我对 OOP 的东西真的很陌生。感谢您的热心帮助。
  • 关于 OOP 的 TOP 概念之一是 encapsulation:类的属性属于声明它们的对象,因此,大多数时候您需要先创建一个新对象,然后再访问它属性/方法。我写“大部分时间”是因为你有static properties/methods,它不需要访问对象实例(即MyClass::$static_property
  • 我建议您阅读有关 getter/setter 的内容,也许它会启发您。
  • 它帮助我消除了疑虑,并使我的 OOP 之旅变得更好。非常感谢保罗的帮助。
猜你喜欢
  • 2010-11-20
  • 2013-04-19
  • 2012-02-22
  • 2018-06-29
  • 2012-03-15
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多