• php面向对象三大特征


    一、封装

    修饰符表现了其封装性:

        a.public 表示全局的。类内部、类外部、子类都可以使用

      b.protected  表示受保护的,只有本类和子类可以使用

     c.private 表示私有的,只能在本类中使用            

    小结:

    1这三个修饰符作用于类的属性和方法

    2类的方法如果不写修饰符,默认是public

    3但是属性不写修饰符会报语法错误

      4私有的和受保护的想要在外部使用可以像在java中定义get/set方法,在get/set方法中还能给访问设置权限[用判断的方法:例如

    public function getFee(){
    if($this->name=="张三"){
    return self::$fee;
    }else{
    return $this->name."不能访问";
    }
    }
    }

    ]

    5private和protected的访问还有一种方法(魔术方法):

        __set/__get方法

    function __set($pro_name,$pro_val){

    $this->pro_name=$pro_val;

    }

    function __get($pro_name){

         if(isset($pro_name)){

    return $this->pro_name;

    }else{

    return null;

    }

    }

    //只能在外部才能设值

     二、继承

    <?php

    class Student{//父类(在这个区域可以访问到public和protected和private做修饰符的变量和属性)
    public $name;
    protected $age=20;
    private $grade=100;
    function __construct(){
    echo "父类构造方法<br/>";
    }
    public function showInfo(){
    echo "父类可以访问||名字:".$this->name."||年龄:".$this->age."||成绩:".$this->grade."<br/>";
    }
    protected function showInfo2(){
    echo "efesfafsaf<br/>";
    }

    }

    class Pupil extends Student{//子类(在这个区域可以访问到public和protected做修饰符的变量和属性)
    function __construct(){

    Student::__construct();//1.显示的调用父类的构造方法

    parent::showInfo2();//调用父类的成员方法
    echo "子类构造方法<br/>";
    }
    public function testing(){

    echo "子类可以访问||名字:".$this->name."和年龄".$this->age."<br/>";
    echo "小学生考试<br/>";

    }


    }

    class Graduate extends Student{//子类(在这个区域可以访问到public和protected做修饰符的变量和属性)
    function __construct(){

    parent::__construct();
    //2.显示的调用父类的构造方法
    Student::showInfo2();
    echo "子类构造方法<br/>";
    }
    public function testing(){
    echo "子类可以访问||名字:".$this->name."和年龄".$this->age."<br/>";
    echo "研究生考试<br/>";
    }

    }
    /*
    $stu1=new Pupil();//是一个外部区域,在这个区域只能访问到public做修饰符的变量和属性
    $stu1->name="zhang";

    echo "外部可以访问||名字:".$stu1->name."<br/>";
    $stu1->showInfo();
    $stu1->testing();
    */
    $stu2=new Graduate();
    $stu2->name="li";
    $stu2->showInfo();
    $stu2->testing();


    ?>

    继承小结:

    1.实现代码的复用性。

    2.extends只能继承public修饰符的变量和方法

    3.在创建(new)子类时,默认情况下不会自动去调用父类的构造方法,这个和java不一样

    如果在创建子类对象是没有写构造方法,但是父类有构造方法,那么就会去调用父类的构造方法,但是子类如果定义了构造方法,父类的构造方法就不会被调用

    方法重载5中通过魔术方法来实现重载的效果

    <?php
    class Test{

    function test1($p){
    echo "接收一个参数:".$p[0]."<br/>";
    }

    function test2($p){
    echo "接收两个参数:";
    for($i=0;$i<count($p);$i++){
    echo $p[$i]."&nbsp;";
    }

    }
    /***
    $a是想要调用的方法名字
    $p是传的参数的数组
    */
    function __call($a,$p){//系统自己调用该方法
    if($a=="test"){
    if(count($p)==1){
    $this->test1($p);
    }else if(count($p)==2){
    $this->test2($p);
    }
    }else{

    echo "没有定义该方法";
    }

    }

    }

    $test=new Test();
    $test->test("nihoa");//test和__call方法中的$a=="test"的test一致,该test可以自己定义
    $test->test("世界","你好");


    ?>

     方法的重写/方法覆盖(override)

    方法的重写是为了解决同一种事物,有相同的行为,但是具体实现不同而出现的。比如:动物都可以叫,但是各种动物的叫法不一样,这时就需要方法重写了。

    方法的重写必须有父类和子类的关系下才有重写。因为方法重写,是重写父类的方法。

    方法名一样,参数个数一样

  • 相关阅读:
    数据结构(线性结构-栈)
    数据结构(线性结构-队列)
    数据结构(树状结构-二叉树)
    数据结构(树状结构-树)
    数据结构(线性结构-串)
    数据结构(堆)
    数据结构(图)
    查找(静态查找表)
    查找(动态查找表)
    查找(哈希表)
  • 原文地址:https://www.cnblogs.com/tangyue/p/3746142.html
Copyright © 2020-2023  润新知