PHP 面向对象编程三大特性
php面向对象编程的三大特征
① 封装
② 继承
③ 多态
=========================================================
php提供了三种访问控制符号.
有三种
1. public 表示全局,可以在本类,类外部,子类 中使用
2. protected 表示受到保护, 可以在本类, 子类中使用
3. private 表示私有, 只能在本类使用
这三个控制修饰符号可以对 属性 和 方法修饰
1. 如果一个方法没有访问修饰符,则默认是public
2. 属性 必须指定访问修饰符
=========================================================
对象继承
class bar extends foo
=========================================================
如果想在类外 访问 protected 变量或者 private 变量
我们现在就想去访问protected 变量或者 private 变量, 通常的做法是提供 public 函数去访问 这些变量. 形式是
public function setXxx($val){ //自定义函数 $this->XXX = $val; } public function getXxx(){ return $this->XXX; }
系统 也提供了 __set 和 __get 方法来操作我们的变量,不推荐,效率也不好
<?php class A{ private $n1; private $n2; private $n3; //使用__set 方法来管理所有的属性 public function __set($pro_name,$pro_val){ //$pro_name 属性的名称 。 $pro_val 属性的值 $this->pro_name=$pro_val; } //使用__get 可以获取所有的属性值 public function __get($pro_name){ //$pro_name 属性的名称 if(isset($pro_name)){ //如果属性名称存在 return $this->pro_name; }else{ return null; } } } $a1=new A(); $a1->n1="hello"; //直接 赋值 echo $a1->n1; $a1->n2=890; echo "||".$a1->n2; ?>
=========================================================
继承 extends
class A{ public $n1=90; } class B extends A{ public $n2="hello"; } class C extends B{ }
3.当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.
4.如果我们希望去调用父类的构造方法,或者其它的方法(public / protected) ,可以这样处理 (了解)
4.1 类名::方法名() 4.2 parent::方法名()
举例
class A{ public $n1=90; //构造方法 public function __construct(){ echo "A __construct"; } } class B extends A{ function __construct(){ echo "B __construct"; //显式的调用父类的方法 //A::__construct(); parent::__construct(); } }
5. 当一个子类的方法和父类的方法完全一样(public protected), 我们称为 方法的覆盖 (方法重写)
=========================================================
PHP5 中如何通过魔术函数来实现方法重载的效果 _call()
_call()函数是php类的默认魔法函数,
__call() 在一个对象的上下文中,如果调用的方法不能访问,它将被触发
<?php class MethodTest { public function __call($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); //此方法不存在,触发__call 函数 ?>
运行结果:
Calling object method 'runTest' in object context
=========================================================
方法的重写/方法的覆盖(override)
当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法,具体用法如下:
<?php //抽象一个Animal类 class Animal{ public $name; protected $price; function cry(){ echo "不知道动物怎么叫.."; } } class Dog extends Animal{ //覆盖 function cry(){ echo "小狗汪汪叫.."; } } class Pig extends Animal{ //覆盖. function cry(){ echo "哼哼叫.."; } } //创建一个只狗 $dog1=new Dog(); $dog1->cry(); $pig1=new Pig(); $pig1->cry(); ?>
=========================================================
多态
<?php class Animal{ public function cry(){ echo '动物叫唤..'; } } class Cat extends Animal{ public function cry(){ echo "abc"; } } $cat1=new Cat(); $cat1->cry(); ?>
当子类没有覆盖父类的方法则 $cat1->cry() 调用的是父类,当 子类覆盖了父类的方法,则调用自己的cry() 。
即 $cat1->cry(); 语句不变,但如果 Cat 类没有 cry方法,则调用 父类 Animal 的方法,如果 Cat 类有cry方法,则调用cry 方法。

浙公网安备 33010602011771号