PHP面向对象编程(三)

PHP静态属性和静态方法

静态属性和方法的定义与调用

通过static关键字来修饰静态属性和方法。由于静态属性和方法可以直接通过类引用,所以又被称为类属性和方法(相应的非静态属性和非静态方法需要实例化后通过对象引用,因此被称为对象属性和对象方法),静态属性和方法通过 类名::属性/方法的方式调用。

<?php
class Car
{
	public static $wheels = 4;
	
	public static function getWheels()
	{
		return self::$wheels;
	}
}

//调用
Car::getWheels();
Car::$wheels;

静态属性和方法同样支持设置private、protected、public三种可见性级别。

静态属性动态修改

Car::$wheels = 8;

调用另一个类的静态属性方法

通过类名::属性/方法调用。

静态方法的继承和重写

<?php
class Car
{
	public static $wheels = 4;
	
	public static function getWheels()
	{
		return self::$wheels;
	}
	
	 public static function getClassName()
    {
        return __CLASS__;
    }

    public static function who()
    {
        echo self::getClassName() . PHP_EOL;
    }
}

class LynkCo01 extends Car
{
    public static function getClassName()
    {
        return __CLASS__;
    }
}

_CLASS_ 可以获取当前的类名

self 指向的是定义时持有他的类

静态绑定

class Car
{
    ...

    public static function getClassName()
    {
        return __CLASS__;
    }

    public static function who()
    {
        echo static::getClassName() . PHP_EOL;
    }
}

class LynkCo01 extends Car
{
    public static function getClassName()
    {
        return __CLASS__;
    }
}

...

Car::who();
LynkCo01::who();

结果

Car
LynkCo01

static指向的是调用它的方法所在的类,而不是定义时

PHP 魔术方法、序列化与对象复制

__sleep()、__wakeup() 与对象序列化

<?php

class Car
{
    protected $brand;

    public static $WHEELS = 4;

    /**
     * @return mixed
     */
    public function getBrand()
    {
        return $this->brand;
    }

    /**
     * @param mixed $brand
     */
    public function setBrand($brand): void
    {
        $this->brand = $brand;
    }
}

$car = new Car();
$car->setBrand("领克01");

// 将对象序列化为字符串后保存到文件
$string = serialize($car);
file_put_contents("car", $string);

对象序列化字符串内容

O:3:"Car":1:{s:8:"*brand";s:8:"领克01";}

在通过unserialize将对象字符反序列化为对象。

// 从文件读取对象字符串反序列化为对象
$content = file_get_contents("car");
$object = unserialize($content);
echo "汽车品牌:" . $object->getBrand() . PHP_EOL;

_ __sleep() 如果在类中存在的话,会在序列化方法 serialize 执行之前调用,以便在序列化之前对对象进行清理工作,相对的, __wakeup() 如果在类中存在的话,会在反序列化方法 unserialize 执行之前调用,以便准备必要的对象资源。

__call() 和 __callStatic()

在对象上调用一个不存在的成员方法时,触发__call。

指定类上调用一个不存在的静态方法触发__callStatic.

__set()、__get()、__isset() 和 __unset()

__set() 方法会在给不可访问属性赋值时调用; __get() 方法会在读取不可访问属性值时调用;当对不可访问属性调用 isset() 或 empty() 时, __isset() 会被调用;当对不可访问属性调用 unset() 时,__unset() 会被调用。

__invoke()

在以函数方式调用对象时执行。

__clone()与对象复制

当我们以 clone 关键字执行对象复制时,会调用这个方法,我们可以通过该方法操纵对象复制的最终结果。

posted @ 2020-07-20 22:06  _大可乐  阅读(202)  评论(0编辑  收藏  举报