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{

        

}

 

讨论继承细节:
1.      父类的 public  protected 的属性和方法被继承. private (私有)的属性和方法没有被继承.
2.      一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承

 

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();
?>
 
关于方法重写细节讨论
1.       要实现重写,要求 子类的那个方法的名字参数列表个数一摸一样,但是并不要求参数的名称一样.
2.       如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) , 父类名::方法名(参数...)
3.       在实现方法覆盖的时候,访问修饰符可以不一样       //但是必须满足: 子类的访问范围>=父类的访问范围

=========================================================

多态

<?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 方法。

posted @ 2013-02-22 09:51  梦话四叶  阅读(172)  评论(0)    收藏  举报