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() 经常用在反序列化操作中,进行一些初始化操作,例如重新建立数据库连接,或执行其它初始化操作。
对象的反序列化过程,与其它变量数据一样;