移动app接口编程技术-学习实现之PHP类其他特性

来源:互联网 发布:java中list用法 编辑:程序博客网 时间:2024/06/05 06:00
  • Static静态关键字

    静态。 在类中,被他标记的变量或方法,不属于任何一个对象。访问的时候要使用“::“。并且在类中自我调用的时候要是用”self::”
    例如:

<?phpclass Car {    private static $speed = 10;    public function getSpeed() {        return self::$speed;    }    //在这里定义一个静态方法,实现速度累加10    public static function speedUp()    {        return self::$speed += 10;    }}$car = new Car();Car::speedUp();  //调用静态方法加速echo $car->getSpeed();  //调用共有方法输出当前的速度值

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

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

访问控制通过关键字public,protected和private来实现。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

类属性必须定义为公有、受保护、私有之一。

类中的方法可以被定义为公有、私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

class Car {    private function __construct() {        echo 'object create';    }    private static $_object = null;    public static function getInstance() {        if (empty(self::$_object)) {            self::$_object = new Car();             //内部方法可以调用私有方法,因此这里可以创建对象        }        return self::$_object;    }}//$car = new Car(); //这里不允许直接实例化对象$car = Car::getInstance(); //通过静态方法来获得一个实例
  • 继承
<?phpclass Car {    public $speed = 0; //汽车的起始速度是0    public function speedUp() {        $this->speed += 10;        return $this->speed;    }}//定义继承于Car的Truck类class Truck extends Car{    public function speedUp() {        $this->speed = parent::speedUp() + 50;    }}$car = new Truck();$car->speedUp();echo $car->speed;
  • 重载

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重载。

lass Car {    public $speed = 0;    public function __call($name, $args) {        if ($name == 'speedUp') {            $this->speed += 10;        }    }}$car = new Car();$car->speedUp(); //调用不存在的方法会使用重载echo $car->speed;
  • 类对象比较

对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符“==“进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符“===“进行判断。

class Car {}$a = new Car();$b = new Car();if ($a == $b) echo '==';   //trueif ($a === $b) echo '==='; //false

对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。

class Car {    public $name = 'car';    public function __clone() {        $obj = new Car();        $obj->name = $this->name;    }}$a = new Car();$a->name = 'new car';$b = clone $a;var_dump($b);

对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

class Car {    public $name = 'car';}$a = new Car();$str = serialize($a); //对象序列化成字符串echo $str.'<br>';$b = unserialize($str); //反序列化为对象var_dump($b);
0 0
原创粉丝点击