在面试的时候发现面试的同学都说知道oop思想,但是连基本的private public protected 有什么差别都回答不上来
这里来解释一下
public:方法或者属性在任何作用域都可以访问到,而且这是默认的,如果没有为一个属性或方法指定访问修饰符,它将是public。
protected:方法或者属性只能从类或者继承类的一个成员中访问到。
private:方法或者属性只能从类的一个成员中访问到,而且无法从继承类的成员中访问到。经过private便签标记的方法或者属性可以在继承类中重新定义。每一个类只能看到它自己定义的私有方法。
说的比较抽象,下面举个例子
例子1:
<?php class Test1 { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; public function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new Test1(); echo $obj->public; // 输出Public echo $obj->protected; // 保护的属性都不能直接引用,显示错误::Fatal error: Cannot access protected property Test1::$protected echo $obj->private; // 私有的属性都不能直接引用,显示错误:Fatal error: Cannot access private property Test1::$private $obj->printHello(); // 正确输出:PublicProtectedPrivate;
例子2:
<?php class Test1 { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; public function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } class Test2 extends Test1 { // 我们可以重新定义公共和受保护的方法,但不能是私人 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new Test2(); echo $obj2->public; // 正确输出:Public echo $obj2->private; // 私有属性可以重新定义,但MyClass2里面没有定义,输出错误:Notice: Undefined property: Test2::$private意思是说没有定义 #echo $obj2->protected; // 受保护的属性不能重新定义输出错误:Fatal error: Cannot access protected property Test2::$protected $obj2->printHello(); // 输出:PublicProtected2Notice: Undefined property: Test2::$private