明天看来是没什么机会写文章了。一早要出外拍照。刚好想到我漏了一个东西没讲。
所以补上去。
先前在第二堂课时,我介绍过三个物件成员:public、private、protected。
可是我在讲继承本篇时,我忘记了这件事。
所以这边做个课后补充。
class animal{ private $animal = 'cat'; private function sleep(){ echo ' sleep'; }}class dog extends animal{}$dog = new dog;echo $dog->animal;$dog->sleep();
上面这个範例中,我们可以看到父类别中的$animal属性及sleep()方法都加上了private私有成员。
先前有讲过,私有成员无法被外部程式及继承的子类别使用。
也因此这个程式就会跑出错误。
但是如果今天我们希望不要被外部程式所能取得使用,但又希望能够取得父类别的使用权限呢?
这时我们可以使用protected(保护成员)来达成这个目标。
请看以下的程式码:
class animal{ protected $animal = 'cat'; protected function sleep(){ echo ' sleep'; }}class dog extends animal{ function sleep(){ parent::sleep(); } function getAnimal(){ return $this->animal; }}$dog = new dog;echo $dog->getAnimal();$dog->sleep();
我们可以看到这边的$dog->sleep();
虽然其继承于父类别,但是因为在子类别重写覆载,所以同名函式会视为「public」。
但是在你做parent::sleep()时就要注意,如果父类别是用private则程式将会出错。
另外外部程式虽然无法叫用protected的元件。
但是如果是子类别去呼叫后传出结果,是视为子类别的public成员的功能。
简单来说子类别呼叫父类别同功能是protected的权限,但是外部程式呼叫子类别的函式功能
是属于public的部份。
通常保护成员的用意大致用在仅允许子类别改写方法时可取得父类别元件功能。
但不允许外部去呼叫父类别来直接使用。
下一堂课「委派」,会是相当有趣的东西。
我先po个程式码各位可以跑跑看。
class animal{ function name(){ $animal = new dog; return $animal->animal; } function shout(){ $animal = new dog; return $animal->shout; }}class dog extends animal{ public $animal = 'dog<br>'; public $shout = 'BOW!';}$dog = new dog;echo $dog->name();echo $dog->shout();