2014-09-01 67 views
0

我最近开始使用PHP的OOP,并使用可见性概念(public,protected,private)。在这里,我对被保护的知名度感到困惑。受保护的成员只能在声明类或子类或子类中访问。我对PHP的网站这个例子:在PHP中的OOP能见度

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的子类?那么为什么这个致命的错误呢?有人可以请教我这个吗?

+4

您正尝试访问两个类范围之外的受保护的成员。 – 2014-09-01 07:52:06

+0

'echo $ obj2-> protected; //致命错误'这条线在两个类之外。它应该如何工作呢?它只能以这种方式与公众一起工作 – 2014-09-01 07:54:31

+0

而且你已经用'printHello'方法演示了你的孩子可以访问父母受保护的财产。 – 2014-09-01 07:55:29

回答

2

protected成员只能是声明类或 子类或子类进行访问。

您必须注意中的

由于您从MyClass2MyClass以外的地方访问$protected,所以发生致命错误。

意味着你可以从MyClass2就像你在MyClass2::printHello()和/或MyClass::printHello()方法做访问它。

+0

好的,谢谢,我明白了,但我有一个相关的困惑。我们是否可以在声明类中回显变量,或者我们必须在类之外创建对象,然后通过对象访问类变量并对其进行回显?这听起来很愚蠢,但我对OOP的东西很陌生。感谢您的亲切帮助。 – user3224207 2014-09-01 08:18:57

+0

关于OOP的TOP概念之一是[封装](http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29):类的属性属于它们被声明的对象,所以大部分您需要先创建一个新对象并访问其属性/方法的时间。我写了“大部分时间”,因为你有[静态属性/方法](http://php.net/manual/en/language.oop5.static.php),它不需要访问对象实例(即'MyClass :: $ static_property') – PauloASilva 2014-09-01 08:38:41

+0

我建议你阅读getters/setters,也许它会启发你。 – PauloASilva 2014-09-01 08:42:00