• PHP学习笔记05——面向对象


      1 <?php
      2 
      3     //1. 类的声明(包括构造方法、析构方法)
      4     class PersonA {
      5         var $name;                    //成员属性,用var声明
      6         public $age;                //当有其他修饰的时候,就不要用var了
      7         private $sex;
      8         function eat(){                //成员方法
      9             echo $this->name." eat now<br/>";    //使用this来引用类的成员属性
     10         }            
     11         private function run(){        //带有权限修饰的成员方法
     12             echo "run now<br/>";
     13         }
     14         
     15         function __construct($name, $age = 23) {    //构造方法,只能有一个,但可以通过默认参数实现类似于C++中的构造函数重载
     16             $this->name = $name;
     17             echo $name." 你好<br/>";
     18         }    
     19         function __destruct() {                        //析构方法,PHP中已经有垃圾回收机制,析构方法在垃圾回收程序回收对象之前自动调用
     20             echo $this->name." 再见<br/>";
     21         }
     22     }
     23     
     24     //2. 类的实例化
     25     $person = new PersonA("张三");
     26     $person->eat();
     27     
     28     //3. 类的封装
     29         /* private、public修饰符 基础的oop知识,不再赘述
     30          * 主要介绍以下几个魔术方法
     31          * __set(propertyName, propertyValue)        使用户可以直接给private变量赋值,赋值时会调用该方法    
     32          * __get(propertyName)                        在获得private变量的值时调用
     33          * __isset,__unset                            对private变量调用iset和unset时使用
     34          */
     35     class PersonB{
     36         private $name;
     37         private $sex;
     38         public function __set($proName, $proValue){
     39             if ($proName == "sex") {
     40                 if ($proValue != "男" && $proValue != "女") return;
     41             }
     42             echo "set $proName to $proValue <br/>";
     43             $this->$proName = $proValue;
     44         }
     45         public function __get($proName) {
     46             echo "get $proName value {$this->$proName} <br/> ";
     47             return $this->sex;
     48         }
     49         public function __isset($proName) {
     50             return isset($this->$proName);
     51         }
     52         public function __unset($proName) {
     53             unset($this->$proName);
     54         }
     55     }
     56     
     57     $person = new PersonB();
     58     var_dump(isset($person->sex));
     59     $person->sex = "123";
     60     $person->sex = "男";
     61     var_dump(isset($person->sex));
     62     echo $person->sex."<br/>";
     63     unset($person->sex);
     64     var_dump(isset($person->sex));
     65     echo "<br/><br/>";
     66     
     67     //4. 类的继承
     68         /* PHP中采用的是和JAVA一样的单继承,使用extends关键字
     69          * protected修饰的成员可以在子类中访问
     70          * 支持重写,但子类中的方法开放程度要高于父类
     71          * 使用parent::fun()可以调用父类中的方法;
     72          */
     73     class PersonAson extends PersonA {
     74         function eat() {
     75             parent::eat();
     76             echo "son eat now<br/>";
     77         }
     78     }
     79     $person = new PersonAson("李四");
     80     $person->eat();
     81     unset($person);            //也可以显示调用 
     82     echo "<br/><br/>";
     83     
     84     //5. 常见的关键字和魔术方法
     85         /* 常用关键字
     86          * final         final修饰的类不能被继承,final修饰的方法不能被重写,注意final不能用来修饰变量
     87          * static        标志类属性和类方法,为所有类共有,使用(类名::方法名)来访问,在类自身也可以用(self::方法名)来访问
     88          * const        定义类常量,通常变量名都是大写,而且使用时不需要$操作符
     89          * instanceof    确定一个对象是类的实例
     90          * clone        使用clone拷贝一个对象
     91          * 常用魔术方法
     92          * __toString()    获取对象字符串表示,输出对象引用时会调用此方法
     93          * __call()        调用类中不存在的方法会调用该防范,第一个参数为函数名,第二个参数为函数列表.有独特的作用.
     94          * __autoload()    在用一个该文件中没有的类的时候,会自动调用该方法,可以在该方法中include类文件等操作
     95          * serialize    对象串行化,以在网络中传输或者保存在文件中.
     96          * unserialize    对象反串行化
     97          */
     98     $person = new PersonA("王五");
     99     $personclone = clone $person;
    100     $personclone->eat();
    101     var_dump($personclone instanceof PersonA);
    102     unset($person);
    103     unset($personclone);
    104     echo "<br/>";
    105     
    106     class PersonC {
    107         private $name;
    108         private $age;
    109         public function __construct($name, $age) {
    110             $this->name = $name;
    111             $this->age = $age;
    112         }
    113         public function __toString() {
    114             return "name: ".$this->name." age: ".$this->age."<br/>";
    115         }
    116         public function __call($method, $args) {        //连贯操作,这里来给变量赋值,在SQL中可能会常用
    117             if ($method == "name")
    118                 $this->name = $args[0];
    119             else if ($method == "age")
    120                 $this->age = $args[0]; 
    121             
    122             return $this;
    123         }
    124     }
    125     $person = new PersonC("zhangsan", 15);
    126     echo $person;                            //这时候其实会调用toString方法
    127     echo $person->name("lisi")->age(20);    //巧妙使用__call方法
    128     
    129     $person_string = serialize($person);
    130     echo $person_string."<br/>";
    131     
    132     $person = unserialize($person_string);
    133     echo $person;
    134     echo "<br/>";
    135     
    136     //6. 抽象类与接口
    137         /* abstract    class    修饰抽象类,不能被实例化,里面的成员不能是private的.里面可以有抽象方法,用abstract修饰,没有任何实现.
    138          *                     子类必须实现所有父类的抽象方法才能实例化,否则也是抽象类.
    139          * interface        所有方法都是抽象方法,只能有const常量,所有成员都必须是public的,子类使用implements实现接口.
    140          *                     接口可以实现多个
    141          * 写法和JAVA基本一致,不再赘述.
    142          */
    143     
    144     //7. 简单多态的应用,一个简单的USB接口程序
    145     interface USB {
    146         function run();
    147     }
    148     class UKey implements USB {
    149         public function run() {
    150             echo "Ukey run<br/>";    
    151         }
    152     }
    153     class UMouse implements USB {
    154         public function run() {
    155             echo "UMouse run<br/>";
    156         }
    157     }    
    158     class Computer {
    159         function useUSB($usb) {
    160             $usb->run();
    161         }
    162     }
    163     $com = new Computer();
    164     $com->useUSB(new UKey());
    165     $com->useUSB(new UMouse());
    166 ?>

     执行结果

    张三 你好
    张三 eat now
    张三 再见
    bool(false) set sex to 男 
    bool(true) get sex value 男 
    男
    bool(false) 
    
    李四 你好
    李四 eat now
    son eat now
    李四 再见
    
    
    王五 你好
    王五 eat now
    bool(true) 王五 再见
    王五 再见
    
    name: zhangsan age: 15
    name: lisi age: 20
    O:7:"PersonC":2:{s:13:"PersonCname";s:4:"lisi";s:12:"PersonCage";i:20;}
    name: lisi age: 20
    
    Ukey run
    UMouse run
  • 相关阅读:
    Pet Shop 4.0 详细解析(转) 沧海一粟
    如何制作Bat批处理文件 沧海一粟
    iOS开发Icon图标设置 (转) 沧海一粟
    Android金背大刀之ToggleButton之稍息立正
    Android碧水剑之DatePickerDialog、TimePickerDialog之岁月如梭
    平衡边界作业算法并发仿真测试基于三层架构的Web系统的基准性能
    Android鸳鸯刀之DatePicker、TimePicker之明年今日
    Android应用性能优化整体策略
    Android应用开发之性能测试之TraceView
    平衡边界作业算法并发仿真测试网络存储系统的响应时间
  • 原文地址:https://www.cnblogs.com/swm8023/p/3225744.html
Copyright © 2020-2023  润新知