一、类中常见魔术函数(拦截重载)
1.魔术方法
__construct()
:类的构造函数__destruct()
:类的析构函数(不能带有任何参数)__call()
:在对象中调用一个不可访问方法时调用__callStatic()
:用静态方式中调用一个不可访问方法时调用__get()
:获得一个类的成员变量时调用__set()
:设置一个类的成员变量时调用__isset()
:当对不可访问属性调用isset()或empty()时调用__unset()
:当对不可访问属性调用unset()时被调用。__sleep()
:执行serialize()时,先会调用这个函数__wakeup()
:执行unserialize()时,先会调用这个函数__toString()
:类被当成字符串时的回应方法__invoke()
:调用函数的方式调用一个对象时的回应方法__set_state()
:调用var_export()导出类时,此静态方法会被调用。__clone()
:当对象复制完成时调用
二、命名空间
1.命名空间的基本组成:命名空间关键字:namespace
+空间名字+空间中主体内容,例如:namespace one
或者namespace one{……}
;
2.命名的空间的思维系统文件夹原理,使用来解决php中全局成员的命名冲突(类、函数、常量)
3.命名空间多层级的写法:namespace one\two\three;
4.当前空间中调用后代命名空间的写法:(可省略当前命名空间名字直接从子级命名空间开始写):在two空间中调用子空间中的类方法three\Demo::show()
5.当前空间中调用父级命名空间的写法:(从根命名空间开始写):在two空间中调用父级空间中的类方法\one\Demo::show()
6.知识点:
clone
:实例化对象后的赋值引用赋值,使用关键字clone可以完成对对象的复制得到新的独立的对象;例如:$obj1=clone $obj
;
实战练习
(一)魔术函数练习
1.代码
<?php
class Demo
{
public $name;
private $age;
//构造函数
public function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
public function __toString(){
return "我是一个类";
}
public function __invoke(){
return "我是一个类";
}
public function __get($name){
return "未定义的属性或无访问权限";
}
public function __set($name,$value){
printf('%s(%s)没有此属性',$name,$value);
}
public function __wakeup(){
echo "反序列成功";
}
public function __sleep(){
// echo "序列化";
return ["a","b"];
}
public function __call($func,$argv){
echo $func."[".implode(",",$argv)."]";
}
static public function __callStatic($func,$argv){
echo $func."[".implode(",",$argv)."]";
}
// 析构函数
// public function __destruct(){
// echo "销毁实列";
// }
}
$demo=new Demo("ldy",20);
echo $demo."<br>";
echo $demo()."<br>";
echo $demo->name."<br>";
echo $demo->myname."<br>";
echo "<hr>";
$demo->sex="男";
echo "<br>";
$demo->name="dlf";
echo $demo->name."<br>";
echo "<hr>";
$string=serialize($demo);
echo $string."<br>";
unserialize($string);
echo "<hr>";
$demo->func(2,3);
Demo::func(4,6,5);
// unset($demo);//销毁$demo实列
echo "<br>";
2.运行结果
(二)命名空间
1.代码
<?php
namespace one
{
class Demo
{
}
// function func(){
// echo "我是one中的函数";
// }
func();//函数在当前空间没有时,会自动向上层空间查找直到摘掉位置;常量和函数相同;但类只会在当前空间查找
echo \Demo::class."<br>";
echo Demo::class."<br>";
echo two\Demo::class."<br>";
}
namespace one\two
{
class Demo
{
}
echo Demo::class."<br>";
echo \one\Demo::class."<br>";
echo \Demo::class."<br>";
}
namespace {
class Demo
{
}
function func(){
echo "我是跟空间函数";
}
func();
echo Demo::class."<br>";
echo one\Demo::class."<br>";
echo one\two\Demo::class."<br>";
}
2.运行结果
(三)命名空间的使用
1.代码
demo11-1.php
<?php
namespace one;
$name="种业圈";
demo11-2.php
<?php
namespace one;
function show($name){
echo "Hello,".$name;
}
demo11.php
<?php
namespace one;
include "demo11-1.php";
include "demo11-2.php";
show($name);
2.运行结果: