工厂设计模式是什么?
根据传递的不同类名参数返回不同类的对象;
工厂模式是生产各种各样的物体;
工厂模式改变了使用 new
关键字在类外创建对象的方式,改为在工厂类内创建对象。
我们不能控制外面班级的行为,但是我们可以控制里面班级的行为。
2.工厂设计模式的要求
一般来说,定义一个工厂类;
工厂类中的方法应该是公共静态方法;
该方法的作用是根据传递的不同参数创建不同的类实例;
3.示例:创建具有不同形状类别的对象。
重载的
1.什么是超载?
在其他编程语言中,面向对象重载是指方法同名但参数列表不同,但 PHP
不支持同名的函数或方法。
PHP
提供的“重载”是指动态“创建”类的属性和方法,我们用魔术的方法实现。
在当前环境中调用未定义或不可见的类属性或方法时,会调用重载方法。
所有重载的方法都必须声明为公共的。
属性重载只能在对象中完成。在静态模式下,这些神奇的方法不会被调用。所以这些方法都不能声明为静态的。
这些神奇方法的参数不能通过引用传递。
2、属性重载
(1)__get
()魔术方法,描述:读取不可访问属性的值时,__get
() 会被调用。
语法:
//汇站网 https
://www
.huizhanii
.com
public
mixed
__get
( string
$name
)
//$name
= 不可访问的属性名
//汇站网 https
://www
.huizhanii
.com
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);
/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
)
//数组变量序列化
$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
的值。
参数:$str
为序列化后的字符串;
返回:返回的是转换之后的值,可为 integer
、float
、string
、array
或 object
。 如果传递的字符串不可序列化,则返回 FALSE
,并产生一个 E_NOTICE
。
//反序列化:序列化字符串,还原成原始变量
//读取记事本的数据
$str
= file_get_contents
('./1.txt
');
//将序列化字符串,还原成变量
$arr
= unserialize
($str
);
//打印变量
print_r
($arr
);
4、对象序列化
对象的序列化过程与其他变量数据的序列化过程相同。对象序列化的内容只能包含成员属性。在序列化对象时,会检查类中是否存在一个魔术方法 __sleep
()。如果存在,该方法会先被调用,然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
5、对象反序列化
对象的反序列化过程与其他变量数据的反序列化过程相同。当对象反序列化时,会检查类中是否存在一个 __wakeup
()方法。如果存在,则会先调用 __wakeup
方法,预先准备对象需要的资源。__wakeup
() 经常用在反序列化操作中,进行一些初始化操作,例如重新建立数据库连接或执行其他初始化操作。对象的反序列化过程与其他变量数据的反序列化过程相同。
LINE
:当前行号FILE
:当前文件DIR
:当前目录FUNCTION
:当前函数CLASS
:当前类METHOD
:当前方法NAMESPACE
:当前命名空间转载请注明:汇站网 » Php
工厂设计模式重载了常见魔法常量的序列化