工厂设计模式是什么?
根据传递的不同类名参数返回不同类的对象;
工厂模式是生产各种各样的物体;
工厂模式改变了使用 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工厂设计模式重载了常见魔法常量的序列化