国强极客
有问题请加微信:guoqiang7585
国强极客

10、php工厂设计模式 重载 序列化 常见魔术常量

10、php工厂设计模式 重载 序列化 常见魔术常量

1、什么是工厂设计模式

根据传递不同的类名参数,返回不同类的对象;
工厂模式,就是生产各种的不同类的对象;
工厂模式,改变了在类外使用new关键字创建对象的方式,改成了在工厂类中创建类的对象
在类的外部我们无法控制类的行为,但在类内部自己可以控制类的行为。

2、工厂设计模式的要求

一般情况下,定义一个工厂类;
工厂类中的方法,应该是公共的静态的方法
该方法功能:就是根据传递的不同参数,去创建不同的类实例;

3、实例:创建不同形状类的对象

重载

1、什么是重载

在其它编程语言中,面向对象的重载是指,方法有相同的名称,但是参数列表不相同的情形,但PHP不支持同名函数或同名方法。
PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法,我们是通过魔术方法来实现的。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用
所有的重载方法都必须被声明为 public
属性重载只能在对象中进行。在静态方式中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。
这些魔术方法的参数都不能通过引用传递。

2、属性重载

(1)__get()魔术方法

描述:读取不可访问属性的值时,__get() 会被调用。
语法:

public mixed __get ( string $name )
//$name = 不可访问的属性名
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //当访问不可访问属性时,__get()魔术方法会自动调用
    public function __get($n)
    {
        return $this->$n;
    }
}
//创建学生类对象
$obj = new Student();
//访问私有的属性
echo "{$obj->name}的年龄是{$obj->age}岁!";

(2)__set()魔术方法

描述:在给不可访问属性赋值时,__set() 会被调用。
语法:

public void __set ( string $name , mixed $value )
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //当给不可访问的属性赋值时,__set()魔术方法自动调用
    public function __set($n,$v)
    {
        $this->$n = $v;
    }
}
//创建学生类对象
$obj = new Student();
//修改私有属性
$obj->name = "刘明明";
$obj->age  = 29;

var_dump($obj);

(3)__isset()魔术方法

描述:当对不可访问属性调用 isset() 或 empty() 时,__isset()会被调用。
语法:

public bool __isset ( string $name )
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //当对不可访问的属性应用isset()或empty()时,__isset()会自动调用
    public function __isset($n)
    {
        return isset($this->$n);
    }
}
//创建学生类对象
$obj = new Student();
//判断私有属性是否存在
if(isset($obj->name))
{
    echo "存在";
}else
{
    echo "不存在或不可访问";
}

(4)__unset()魔术方法

描述:当对不可访问属性调用 unset() 时,__unset()会被调用。
语法:

public void __unset ( string $name )
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //当对私有属性应用unset()时,魔术方法__unset()自动调用
    public function __unset($n)
    {
        unset($this->$n);
    }
}
//创建学生类对象
$obj = new Student();
//删除对象属性
unset($obj->name);

var_dump($obj);

3、方法重载

(1)__call()魔术方法

描述:在对象中调用一个不可访问方法时,__call() 会被调用。
语法:

public mixed __call ( string $name , array $arguments )
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //当访问不存在或不可访问的方法时,魔术方法__call()自动调用
    //参数:$func是传递过来的方法名称,$args是传递过来的参数数组
    public function __call($func,$args)
    {
        echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
    }
}
//创建学生类对象
$obj = new Student();
//调用一个不存在的方法
$obj->showInfo("张三",24);

(2)__callStatic()魔术方法

描述:用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
语法:

public static mixed __callStatic ( string $name , array $arguments )
class Student
{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //用静态化方式访问不存在或不可访问的方法时,魔术方法__callStatic()自动调用
    //参数:$func是传递过来的方法名称,$args是传递过来的参数数组
    public static function __callStatic($func,$args)
    {
        echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
    }
}
//用静态化方法调用showInfo()方法
Student::showInfo('张三四',24,'男');

变量序列化

1、什么是变量序列化

序列化是将变量转换为可保存或传输的字符串的过程;
反序列化就是在适当的时候把这个字符串再转化成原来的变量使用
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性;
序列化有利于存储或传递 PHP 的值,同时不丢失其类型和结构。

2、序列化函数serialize()

描述:产生一个可存储的值的表示;
语法:

string serialize ( mixed $value )

参数:$value可以是任何类型,除了资源外
返回:返回序列化之后的字符串,可以存储于任何地方。

//数组变量序列化
$arr = array(
        'db_host' => 'localhost',
        'db_user' => 'root',
        'db_pass' => 'root',
        'db_name' => 'itcast',
    );
//序列化:将变量转成可保存的字符串
$str = serialize($arr);
//将序列化字符串,保存到记事本
file_put_contents('./1.txt',$str);

3、反序列化函数unserialize()

描述:从已存储的表示中创建 PHP 的值
语法:

mixed unserialize ( string $str )

说明:对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
参数:$str为序列化后的字符串;
返回:返回的是转换之后的值,可为 integer、float、string、array或 object。 如果传递的字符串不可序列化,则返回 FALSE,并产生一个 E_NOTICE。

//反序列化:序列化字符串,还原成原始变量
//读取记事本的数据
$str = file_get_contents('./1.txt');
//将序列化字符串,还原成变量
$arr = unserialize($str);
//打印变量
print_r($arr);

4、对象序列化

对象的序列化过程,与其它变量数据一样;
对象序列化的内容只能包含成员属性
当序列化对象时,serialize()函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组

5、对象反序列化

对象的反序列化过程,与其它变量数据一样;
当对象反序列化时,unserialize()函数会检查类中是否存在一个__wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。 __wakeup() 经常用在反序列化操作中,进行一些初始化操作,例如重新建立数据库连接,或执行其它初始化操作。
对象的反序列化过程,与其它变量数据一样;

常用的魔术常量

LINE:当前行号

FILE:当前文件

DIR:当前目录

FUNCTION:当前函数

CLASS:当前类

METHOD:当前方法

NAMESPACE:当前命名空间

赞赏
对内容有疑问,请加我微信:guoqiang7585
# # # # #
首页      全栈教程      php高级      10、php工厂设计模式 重载 序列化 常见魔术常量

国强极客

文章作者

博客站长,有问题请加微信【guoqiang7585】。

国强极客

10、php工厂设计模式 重载 序列化 常见魔术常量
1、什么是工厂设计模式 根据传递不同的类名参数,返回不同类的对象; 工厂模式,就是生产各种的不同类的对象; 工厂模式,改变了在类外使用new关键字创建对象的方式,改成了在工厂类中创…
扫描二维码继续阅读
2019-08-10