Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP面向对象---封装、继承、多态 #19

Open
hubvue opened this issue Dec 22, 2018 · 0 comments
Open

PHP面向对象---封装、继承、多态 #19

hubvue opened this issue Dec 22, 2018 · 0 comments
Labels
PHP Extra attention is needed

Comments

@hubvue
Copy link
Owner

hubvue commented Dec 22, 2018

PHP面向对象之封装性

设置私有成员与私有成员的访问

封装的修饰符

封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节以达到对成员的访问控制(切记不是拒绝访问)。

//PHP支持如下3种访问修饰符
    public     (公有的、默认)
    private      (私有的)
    protected     (受保护的)

修饰符的访问权限

环境 private protected public
在同一类中 可以 可以 可以
在类的外部 不可以 不可以 可以

设置私有成员

只要再声明成员或成员方法时,使用private关键字修饰就是实现了对成员的私有封装。

class Person {
    private $name;
    private $age;
    private function say(){

    }
}

访问私有成员

封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用$this访问。

class Person {
    private $name ;
    public function say (){
        return $this -> name;
    }
}

魔术方法

魔术方法只针对 protected或者private的属性

__set()

//set方法
    public function __set($key,$value){
        //魔术方法的set只针对 protected或者private的属性
        if($key == 'name' && $value == "laowang"){
            $this -> name = "xiaowang";
        }
    }
    $xw ->age = 18;

__get()

//get方法
    public function __get($key){
        if($key == 'age'){
            return 'girl not till you';
        }
    }
    echo $xw ->age;

__isset()

当成员属性可以在外部访问的时候isset判断为true、放成员属性无法在外部访问的时候isset判断为false .

//isset方法
    public function __isset($key){
        if($key == "age"){
            return true;
        }
    }
    var_dump(isset($xw -> age));        //false
    //var_dump 打印输出

__unset()

把对象中的属性销毁

//unset方法
    public function __unset($key){
        if($key == "age") {
            unset($this -> age);
        }
    }
    unset($xw -> age);

PHP面向对象之继承性

类继承的应用

PHP只支持单继承,不允许多重继承.一个子类只能有一个父类,不允许一个子类直接继承多个类,但一个类可以被多个类继承,可以有多层继承,即一个雷可以继承某一个类的子类,如类B继承了类A,类C又继承了类B,那么类C也间接继承了类A。

class A {

}
class B extends A{

}

继承中修饰符的访问权限

环境 private protected public
在同一类中 可以 可以 可以
在类的外部 不可以 不可以 可以
在子类中 不可以 可以 可以

PHP面向对象之多态

对象的多态:是指咋父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。

多态中最关键的实现形式就是函数的重载与重写。

子类中重载父类的方法

  1. 重载:父类中定义的方法,子类中有相同的方法名,但是参数个数不同
  2. 重写:父类中定义的方法,子类中有相同的方法名,参数个数相同

在子类里面允许重写(覆盖)父类中的方法,使用parent访问父类中被覆盖的属性和方法

parent::construct();
parent::fun();

例子

class Person {
    public $name;
    private $age;
    protected $money;
    public function __construct($name,$age , $money){
        $this -> name = $name;
        $this -> age = $age;
        $this -> money = $money;
    }
    public function cardInfo(){
        echo "name-> ".$this->name . "  age->".  $this->age . "   money". $this->money;
    }
}
class YellowPerson extends Person{
    function __construct($name,$age,$money){
        parent::__construct($name,$age,$money);
    }
                        
    public function cardInfo($pp){
        //如果不加parent::cardInfo,就表示重写了父类的方法,再重新调用一下父类的方法。
        parent::cardInfo();
        echo $pp;
    }
    public function getMoney(){
        echo $this -> money;
    }
}
$s = new YellowPerson("xiaowang",22,100);
$s -> cardInfo(11);
echo $s -> name;        //公有属性可以继承
// echo $s -> age;         //私有属性无法继承
echo $s -> getMoney();       //外部不能访问,但是可以继承过来
@hubvue hubvue added the PHP Extra attention is needed label Jan 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PHP Extra attention is needed
Projects
None yet
Development

No branches or pull requests

1 participant