zoukankan      html  css  js  c++  java
  • 类与面向对象基础(二)

    一、构造函数和析构函数

    PHP中可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

    class Car {
       function __construct() {
           print "构造函数被调用
    ";
       }
    }
    $car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

    在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

    class Car {
       function __construct() {
           print "父类构造函数被调用
    ";
       }
    }
    class Truck extends Car {
       function __construct() {
           print "子类构造函数被调用
    ";
           parent::__construct();
       }
    }
    $car = new Truck();

    同样,PHP中支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

    class Car {
       function __construct() {
           print "构造函数被调用 
    ";
       }
       function __destruct() {
           print "析构函数被调用 
    ";
       }
    }
    $car = new Car(); //实例化时会调用构造函数
    echo '使用后,准备销毁car对象 
    ';
    unset($car); //销毁时会调用析构函数

    当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

    二、static静态关键字

    静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。

    class Car {
        private static $speed = 10;
        
        public static function getSpeed() {
            return self::$speed;    //在方法中使用self访问静态成员并返回
        }
    }
    echo Car::getSpeed();  //调用静态方法

    静态方法也可以通过变量来进行动态调用

    $func = 'getSpeed';
    $className = 'Car';
    echo $className::$func();  //动态调用静态方法

    静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

    class Car {
        private static $speed = 10;
        
        public static function getSpeed() {
            return self::$speed;
        }
        
        public static function speedUp() {
            return self::$speed+=10;
        }
    }
    class BigCar extends Car {
        public static function start() {
            parent::speedUp();
        }
    }
    
    BigCar::start();
    echo BigCar::getSpeed();

    三、重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。

    class Car {
        private $ary = array();
        
        public function __set($key, $val) {
            $this->ary[$key] = $val;
        }
        
        public function __get($key) {
            if (isset($this->ary[$key])) {
                return $this->ary[$key];
            }
            return null;
        }
        
        public function __isset($key) {
            if (isset($this->ary[$key])) {
                return true;
            }
            return false;
        }
        
        public function __unset($key) {
            unset($this->ary[$key]);
        }
    }
    $car = new Car();
    $car->name = '汽车';  //name属性动态创建并赋值
    echo $car->name;

    方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。

    class Car {
        public $speed = 0;
        
        public function __call($name, $args) {
            if ($name == 'speedUp') {
                $this->speed += 10;
            }
        }
    }
    $car = new Car();
    $car->speedUp(); //调用不存在的方法会使用重载
    echo $car->speed;
  • 相关阅读:
    linux ramdisk
    linux系统灵活运用灯[android课程3]
    linux编译注解
    Linux内核3.0移植并基于Initramfs根文件系统启动
    linux0.11文件分析
    2.2linux内核移植简介
    sudo: ./sd_fusing.sh:找不到命令
    Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]
    Exynos 4412的启动过程分析[2]
    POJ 3009 Curling 2.0 {深度优先搜索}
  • 原文地址:https://www.cnblogs.com/sdzbxfcy/p/5565212.html
Copyright © 2011-2022 走看看